[C++]LeetCode: 78 Unique Paths II
2015-01-08 13:08
543 查看
题目:
Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as
in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
The total number of unique paths is
Note: m and n will be at most 100.
思路:这道题和LeetCode:
56 Unique Paths非常相似,只是这次首先要先判断是否有障碍。不是每次都有两个选择(向右,向下)。因为有了这个,我们不能直接求和得到结果。递推式和unique path一样,不过我们每次都要先判断是否有障碍,如果有,dp[i][j] = 0,如果没有dp[i][j] = dp[i-1][j] + dp[i][j-1]. 所以,实际上我们还是只需要一个一维数组,因为更新时的信息足够了。
Attention:
1. 注意和unique path的区别,首先是一维数组的初始化,由于我们还需要判断第一行是否存在障碍,所以初始化时为0.
AC Code:
Follow up for "Unique Paths":
Now consider if some obstacles are added to the grids. How many unique paths would there be?
An obstacle and empty space is marked as
1and
0respectively
in the grid.
For example,
There is one obstacle in the middle of a 3x3 grid as illustrated below.
[ [0,0,0], [0,1,0], [0,0,0] ]
The total number of unique paths is
2.
Note: m and n will be at most 100.
思路:这道题和LeetCode:
56 Unique Paths非常相似,只是这次首先要先判断是否有障碍。不是每次都有两个选择(向右,向下)。因为有了这个,我们不能直接求和得到结果。递推式和unique path一样,不过我们每次都要先判断是否有障碍,如果有,dp[i][j] = 0,如果没有dp[i][j] = dp[i-1][j] + dp[i][j-1]. 所以,实际上我们还是只需要一个一维数组,因为更新时的信息足够了。
Attention:
1. 注意和unique path的区别,首先是一维数组的初始化,由于我们还需要判断第一行是否存在障碍,所以初始化时为0.
<span style="font-size:14px;">vector<int> dp(col, 0);</span>2. 由于我们还需要计算第一行的dp值,所以循环范围从0~row, 0~col.注意计算递归式时,dp[ci] = dp[ci] + dp[ci-1],要先判断ci>0.
<span style="font-size:14px;">for(int ri = 0; ri < row; ri++) { for(int ci = 0; ci < col; ci++) {</span>3. 我们需要初始化dp[0], 如果obstacleGrid[0][0] = 1, 则会重置dp[0] 为0, 否则dp[0]= 1,将用于更新下一个动态规划表的值。
<span style="font-size:14px;">if(obstacleGrid[ri][ci] == 1) { dp[ci] = 0; } else { if(ci > 0) dp[ci] = dp[ci] + dp[ci-1]; }</span>复杂度:时间复杂度,一次遍历O(n), 空间复杂度,一维数组,O(N)
AC Code:
<span style="font-size:14px;">class Solution { public: int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { int row = obstacleGrid.size(); int col = obstacleGrid[0].size(); if(row == 0 || col == 0) return 0; vector<int> dp(col, 0); dp[0] = 1; for(int ri = 0; ri < row; ri++) { for(int ci = 0; ci < col; ci++) { if(obstacleGrid[ri][ci] == 1) { dp[ci] = 0; } else { if(ci > 0) dp[ci] = dp[ci] + dp[ci-1]; } } } return dp.back(); } };</span>
相关文章推荐
- leetcode 63 C++. Unique Paths II
- LeetCode 63 — Unique Paths II(C++ Java Python)
- leetcode_c++:Unique Paths II(063)
- LeetCode:Unique Paths II
- [leetcode]Unique Paths II
- LeetCode 63: Unique Paths II
- [leetcode] Unique Paths II
- [leetcode刷题系列]Unique Paths II
- Unique Paths II 求在矩阵里从左上走到右下的总方法数(有障碍)@LeetCode
- [LeetCode]Unique Paths I & II
- [LeetCode] Unique Paths II
- [LeetCode]Unique Paths II
- LeetCode: Unique Paths II
- LeetCode题解:Unique Paths II
- leetcode - Unique Paths II
- LeetCode: Unique Paths II
- LeetCode : Unique Paths II
- LeetCode Online Judge 题目C# 练习 - Unique Paths II
- [LeetCode] Unique Paths II 解题报告
- Unique Paths II [LeetCode]