代码随想录算法训练营第三十一天| 62.不同路径 63. 不同路径 II
62.不同路径
思路:
因为只能向左,和向下,因此只能是前面的加上左边的,递推公式较为简单
代码:
1 int uniquePaths(int m, int n) { 2 if (m == 1 || n == 1) return 1; 3 4 vector<vector<int>> nums(m, vector<int>(n, 1)); 5 6 for (int i = 1; i < m; i++) 7 { 8 for (int j = 1; j < n; j++) 9 { 10 nums[i][j] = nums[i][j - 1] + nums[i - 1][j]; 11 } 12 } 13 14 return nums[m - 1][n - 1]; 15 }
63. 不同路径 II
思路:
思路也较为简单,如果上面没有任何邻居,左边是障碍的话,只能全部0
代码:
1 int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { 2 int m = obstacleGrid.size(); 3 int n = obstacleGrid[0].size(); 4 5 if (obstacleGrid[m - 1][n - 1] == 1) return 0; 6 vector<vector<int>> nums(m, vector<int>(n, 0)); 7 8 //只能全为0,然后第一个为1/0 如果是靠边的,那么就只能加左边的 9 10 if (obstacleGrid[0][0] == 0) nums[0][0] = 1; 11 12 for (int i = 0; i < m; i++) 13 { 14 for (int j = 0; j < n; j++) 15 { 16 if (i == 0 && j == 0) 17 continue; 18 if (obstacleGrid[i][j] == 1) 19 continue; 20 if (i == 0) 21 { 22 nums[i][j] = nums[i][j - 1]; 23 } 24 if (j == 0) 25 { 26 nums[i][j] = nums[i - 1][j]; 27 } 28 if (i != 0 && j != 0) 29 { 30 nums[i][j] = nums[i - 1][j] + nums[i][j - 1]; 31 } 32 } 33 } 34 35 return nums[m - 1][n - 1]; 36 }