首页 > 编程语言 >代码随想录算法训练营第三十九天|● 62.不同路径 ● 63. 不同路径 II

代码随想录算法训练营第三十九天|● 62.不同路径 ● 63. 不同路径 II

时间:2024-03-07 15:45:41浏览次数:37  
标签:vector 路径 int numerator 第三十九 随想录 denominator obstacleGrid dp

不同路径 

题目链接:62. 不同路径 - 力扣(LeetCode)

思路:由于不能回退,因此每一格只能来自上一格或左边一格,因此dp数组中每个格子只要将这两个格子的值相加即可。

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n));
        for(int i=0;i<m;i++)dp[i][0]=1;
        for(int j=0;j<n;j++)dp[0][j]=1;
        for(int x=1;x<m;x++){
            for(int y=1;y<n;y++){
                dp[x][y]=dp[x-1][y]+dp[x][y-1];
            }
        }
        return dp[m-1][n-1];
    }
};

写题的时候想了一下,不能像昨天那样压缩到三个int解决问题,但是发现可以压缩到一个一维数组

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<int> dp(n);
        for (int i = 0; i < n; i++) dp[i] = 1;
        for (int j = 1; j < m; j++) {
            for (int i = 1; i < n; i++) {
                dp[i] += dp[i - 1];
            }
        }
        return dp[n - 1];
    }
};

作者:代码随想录
链接:https://leetcode.cn/problems/unique-paths/solutions/2562792/dai-ma-sui-xiang-lu-leetcode62bu-tong-lu-ncye/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

同时还有难以理解的数学优化。到达左下角,共需向右m-1次,向下n-1次,因此要走m+n-2次,只要在这m+n-2次中选择m-1步向下走即可。注意这种想法(算阶乘)极其容易溢出。如下面的错误示范,不能把分子分母分开算。

class Solution {
public:
    int uniquePaths(int m, int n) {
        int numerator = 1, denominator = 1;
        int count = m - 1;
        int t = m + n - 2;
        while (count--) numerator *= (t--); // 计算分子,此时分子就会溢出
        for (int i = 1; i <= m - 1; i++) denominator *= i; // 计算分母
        return numerator / denominator;
    }
};


作者:代码随想录
链接:https://leetcode.cn/problems/unique-paths/solutions/2562792/dai-ma-sui-xiang-lu-leetcode62bu-tong-lu-ncye/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

正确做法是:

class Solution {
public:
    int uniquePaths(int m, int n) {
        long long numerator = 1; // 分子
        int denominator = m - 1; // 分母
        int count = m - 1;
        int t = m + n - 2;
        while (count--) {
            numerator *= (t--);
            while (denominator != 0 && numerator % denominator == 0) {
                numerator /= denominator;
                denominator--;
            }
        }
        return numerator;
    }
};

作者:代码随想录
链接:https://leetcode.cn/problems/unique-paths/solutions/2562792/dai-ma-sui-xiang-lu-leetcode62bu-tong-lu-ncye/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

不同路径 II 

题目链接:63. 不同路径 II - 力扣(LeetCode)

思路:对于障碍物,就不初始化,计算dp时也直接跳过就好了。

哪个啥篮子把障碍物堵门啊??

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m=obstacleGrid.size();
        int n=obstacleGrid[0].size();
        vector<vector<int>> dp(m,vector<int>(n,0));
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0
            return 0;
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++)
            if(obstacleGrid[i][j]==0)
            dp[i][j]=dp[i-1][j]+dp[i][j-1];
        }
        return dp[m-1][n-1];
    }
};

 

标签:vector,路径,int,numerator,第三十九,随想录,denominator,obstacleGrid,dp
From: https://www.cnblogs.com/Liubox/p/18059051

相关文章

  • day57 动态规划part14 代码随想录算法训练营 1143. 最长公共子序列
    题目:1143.最长公共子序列我的感悟:你永远不知道自己有多厉害!加油!理解难点:递推公式如何想,通过图,来记忆。听课笔记:我的代码:classSolution:deflongestCommonSubsequence(self,text1:str,text2:str)->int:#假设text1为内层,text2为外层n......
  • 代码随想录算法训练营第三十七天 | 62.不同路径 ,63. 不同路径 II
    63.不同路径II 已解答中等 相关标签相关企业 提示 一个机器人位于一个 mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。现在考虑......
  • 代码随想录算法训练营第二天| 977.有序数组的平方、 209.长度最小的子数组、 59.螺旋
    977.有序数组的平方https://leetcode.cn/problems/squares-of-a-sorted-array/description/publicstaticint[]sortedSquares(int[]nums){intleft=0;intright=nums.length-1;int[]result=newint[nums.length];intwrite=......
  • 杭州银行新核心:架构转型新路径、自主安全新答卷
    ​近几年,以云计算平台、分布式数据库、操作系统、中间件等为代表的国产化技术软件逐渐被广泛应用在从外围改造到核心系统的转型升级中,随着银行核心IT从业者和各类厂商的不断实践和经验积累,国产化的云原生、分布式核心业务系统已经成为未来主要发展趋势。 过去的信息科技体系以......
  • 最短路径算法
    最短路径我们把边具有权重的图称为带权图,权重可以理解为两点间的距离。一个图中任意两点会有多条路径联通,最短路径就是这些路径中最短的一条。负环:环中所有边权之重和小于0的环Floyed算法算法思想如何让两个点(假设a到b)的距离变短,只能引入第三个点k,通过k进行中转即a->k->b,当......
  • 二叉树中的最大路径和
    124.二叉树中的最大路径和二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。路径和 是路径中各节点值的总和。给你一个二叉树的根节点 root......
  • 最短路径问题的Dijastra算法
    求节点间最短路径的Dijastra算法思路概述给定一个权值非负的有向连通图,求某个特定原点(假定节点编号为0)到终点的最短路径权值之和。Dijastra算法采用贪心思想,每次选取最短距离可到达的点确定对应路径权值之和,并用以更新其它邻接点的可到达最短距离直至确定终点或者所有节......
  • 本地快速搭建airflow docker镜像,映射本地路径
    airflow官方文档拉取镜像dockerpullapache/airflow:2.8.2拉取配置文件curl-LfO'https://airflow.apache.org/docs/apache-airflow/2.8.2/docker-compose.yaml'修改刚刚拉取的yaml文件关闭示例dagAIRFLOW__CORE__LOAD_EXAMPLES:'false'映射本地路径volumes:......
  • Python涉及路径相关的知识点
    脚本中的路径信息print('__file__:',__file__)#脚本的位置print('os.path.abspath(__file__)::',__file__)#脚本的绝对路径(和上面的一般情况下是一样的)print('os.path.abspath(__file__):',os.path.abspath(__file__))SCRIPT_DIR=os.path.dirname(os.path.abspat......
  • 代码随想录算法训练营day14 | leetcode 144. 二叉树的前序遍历、145. 二叉树的后序遍
    目录题目链接:144.二叉树的前序遍历-简单题目链接:145.二叉树的后序遍历-简单题目链接:94.二叉树的中序遍历-简单递归三要素:确定递归函数的参数和返回值:确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数,并且还要明确每次递归的返回值是什么进而确定递归......