不同路径II

时间:2021-08-08
本文章向大家介绍不同路径II,主要包括不同路径II使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

题源:LeetCode

链接:https://leetcode-cn.com/problems/unique-paths-ii/

其实和上一个随笔中的不同路径一样,只是多了个障碍物,多了个判断的过程。

 1 class Solution {
 2 public:
 3     int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
 4         if(obstacleGrid.size() == 0) return 0;
 5         //define dp: dp[m][n]表示在位置[m][n]时到达右下角有dp[m][n]条路径
 6         int m = obstacleGrid.size();
 7         int n = obstacleGrid[0].size();
 8         if(obstacleGrid[m - 1][n - 1] == 1) return 0;
 9         vector<vector<long long>> dp(m, vector<long long>(n, 0));
10         //base case 
11         //这道题状态转移需要从最右下角开始,是确定状态base case
12         for(int i = m - 1; i >= 0; i--){
13             if(obstacleGrid[i][n - 1] == 1)
14                 break;
15             else
16                 dp[i][n - 1] = 1;
17         }
18         for(int j = n - 1; j >= 0; j--){
19             if(obstacleGrid[m - 1][j] == 1)
20                 break;
21             else
22                 dp[m - 1][j] = 1;
23         }
24         //for循环遍历所有状态
25         for(int i = m - 2; i >=0; i--){
26             for(int j = n - 2; j >= 0; j--){
27                 if(obstacleGrid[i][j] == 1)
28                     dp[i][j] = 0;
29                 else
30                     dp[i][j] = dp[i + 1][j] + dp[i][j + 1];
31             }
32         }
33         return dp[0][0];
34 
35 
36     }
37 };

官方答案中使用到了滚动数组思想,节约了空间,后面会去学习一下用法。

原文地址:https://www.cnblogs.com/hosheazhang/p/15114107.html