算法训练Day39|62.不同路径 ● 63. 不同路径 II

简介: 算法训练Day39|62.不同路径 ● 63. 不同路径 II

LeetCode:62.不同路径

62. 不同路径 - 力扣(LeetCode)


1.思路

想象成矩阵填格子,两个关键点,初始化和递推公式。

初始化除点(0,0)第一行第一列均为1,递推公式推导dp[i][j] = dp[i - 1][j] + dp[i][j - 1];


2.代码实现

 1class Solution {
 2    public int uniquePaths(int m, int n) {
 3        // 二维数组
 4        int[][] dp = new int[m][n];
 5
 6        // dp[m][n]:到达m,n位置,有dp[m][n]种路径
 7        // 初始化
 8        for (int i = 0; i < m; i++) {
 9            dp[i][0] = 1;
10        }
11        for (int i = 0; i < n; i++) {
12            dp[0][i] = 1;
13        }
14        for (int i = 1; i < m; i++) {
15            for (int j = 1; j < n; j++) {
16                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
17            }
18        }
19        return dp[m - 1][n - 1];
20    }
21}
22

3.复杂度分析

时间复杂度:O(m * n).

空间复杂度:O(m * n).


LeetCode:63. 不同路径 II

63. 不同路径 II - 力扣(LeetCode)


1.思路

确定dp[][]数组,

条件排除,各种情况的考虑很关键,首尾节点和首行首列会影响初始化,当前节点影响dp[i][j]的值,


2.代码实现

 1class Solution {
 2    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
 3        // 求出总路径数 - 障碍位置路径数?
 4
 5        int m = obstacleGrid.length; // 获取行数
 6        int n = obstacleGrid[0].length; // 获取列数
 7        // dp[m][n] 表示节点(m,n)处潜在路径数
 8        int[][] dp = new int[m][n];
 9        // 当起始节点和终止节点均有障碍时,无结果,直接返回0
10        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
11            return 0;
12        }
13        // 每行的首位数字初始化(也即首列初始化),遇到障碍设置为0
14        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
15            dp[i][0] = 1;
16        }
17        // 每列的首位数字初始化(也即首行初始化),遇到障碍设置为0
18        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
19            dp[0][j] = 1;
20        }
21        // 遍历输出dp[][]数组值
22        for (int i = 1; i < m; i++) {
23            for (int j = 1; j < n; j++) [
24                if (obstacleGrid[i][j] == 0) { // 当前节点没有障碍时,正常执行
25                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
26                } else {
27                    dp[i][j] = 0; // 有障碍时直接赋值为0
28                }
29            ]
30        }
31        // 数组下标从0 开始,m - 1, n - 1也就代表(m,n)位置
32        return dp[m - 1][n - 1];
33
34    }
35}
36

3.复杂度分析

时间复杂度:O(m * n).

空间复杂度:O(m * n).

相关文章
|
6天前
|
算法
算法修炼-动态规划之路径问题(1)
算法修炼-动态规划之路径问题(1)
|
6天前
|
算法 Java
算法:Java计算二叉树从根节点到叶子结点的最大路径和
算法:Java计算二叉树从根节点到叶子结点的最大路径和
|
6天前
|
传感器 算法 自动驾驶
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
108 0
混合A*运动规划算法:路径规划和路径跟踪-MPC-LQR-PID算法
|
6天前
|
算法 测试技术 C++
【动态规划】【图论】【C++算法】1575统计所有可行路径
【动态规划】【图论】【C++算法】1575统计所有可行路径
|
6天前
|
算法
【算法优选】 动态规划之路径问题——贰
【算法优选】 动态规划之路径问题——贰
|
6天前
|
存储 算法
算法编程(二十六):判断路径是否相交
算法编程(二十六):判断路径是否相交
32 0
|
5月前
|
算法 Python
Python算法——树的路径和算法
Python算法——树的路径和算法
169 1
|
6天前
|
算法 机器人
算法沉淀 —— 动态规划篇(路径问题)
算法沉淀 —— 动态规划篇(路径问题)
28 0
|
6天前
|
算法 测试技术 C++
【动态规划】【map】【C++算法】1289. 下降路径最小和 II
【动态规划】【map】【C++算法】1289. 下降路径最小和 II
|
6天前
|
算法 C++
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径
【动态规划】【矩阵】C++算法329矩阵中的最长递增路径