代码随想录算法训练营第三十一天| 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 }

 

posted @ 2023-07-15 15:02  博二爷  阅读(63)  评论(0编辑  收藏  举报