LeetCode:Unique Paths I II
2014-05-02 15:25
441 查看
Unique Paths
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
算法1:最容易想到的是递归解法,uniquePaths(m, n) = uniquePaths(m, n-1) + uniquePaths(m-1, n), 递归结束条件是m或n等于1,这个方法oj超时了
算法2:动态规划,算法1的递归解法中,其实我们计算了很多重复的子问题,比如计算uniquePaths(4, 5) 和 uniquePaths(5, 3)时都要计算子问题uniquePaths(3, 2),再者由于uniquePaths(m, n) = uniquePaths(n, m),这也使得许多子问题被重复计算了。要保存子问题的状态,这样很自然的就想到了动态规划方法,设dp[i][j] = uniquePaths(i, j), 那么动态规划方程为:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
边界条件:dp[i][1] = 1, dp[1][j] = 1
上述过程其实是从左上角开始,逐行计算到达每个格子的路线数目,由递推公式可以看出,到达当前格子的路线数目和两个格子有关:1、上一行同列格子的路线数目;2、同一行上一列格子的路线数目。据此我们可以优化上面动态规划方法的空间:
算法3:其实这个和组合数有关,对于m*n的网格,从左上角走到右下角,总共需要走m+n-2步,其中必定有m-1步是朝右走,n-1步是朝下走,那么这个问题的答案就是组合数:
, 这里需要注意的是求组合数时防止乘法溢出 本文地址
Unique Paths II
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
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.
这一题可以完全采用和上一题一样的解法,只是需要注意dp的初始化值,和循环的起始值
【版权声明】转载请注明出处:/article/4879731.html
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).
The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).
How many possible unique paths are there?
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
算法1:最容易想到的是递归解法,uniquePaths(m, n) = uniquePaths(m, n-1) + uniquePaths(m-1, n), 递归结束条件是m或n等于1,这个方法oj超时了
class Solution { public: int uniquePaths(int m, int n) { if(m == 1 || n == 1)return 1; else return uniquePaths(m, n - 1) + uniquePaths(m - 1, n); } };
算法2:动态规划,算法1的递归解法中,其实我们计算了很多重复的子问题,比如计算uniquePaths(4, 5) 和 uniquePaths(5, 3)时都要计算子问题uniquePaths(3, 2),再者由于uniquePaths(m, n) = uniquePaths(n, m),这也使得许多子问题被重复计算了。要保存子问题的状态,这样很自然的就想到了动态规划方法,设dp[i][j] = uniquePaths(i, j), 那么动态规划方程为:
dp[i][j] = dp[i-1][j] + dp[i][j-1]
边界条件:dp[i][1] = 1, dp[1][j] = 1
class Solution { public: int uniquePaths(int m, int n) { vector<vector<int> > dp(m+1, vector<int>(n+1, 1)); for(int i = 2; i <= m; i++) for(int j = 2; j <= n; j++) dp[i][j] = dp[i-1][j] + dp[i][j-1]; return dp[m] ; } };
上述过程其实是从左上角开始,逐行计算到达每个格子的路线数目,由递推公式可以看出,到达当前格子的路线数目和两个格子有关:1、上一行同列格子的路线数目;2、同一行上一列格子的路线数目。据此我们可以优化上面动态规划方法的空间:
class Solution { public: int uniquePaths(int m, int n) { vector<int>dp(n+1, 1); for(int i = 2; i <= m; i++) for(int j = 2; j <= n; j++) dp[j] = dp[j] + dp[j-1]; return dp ; } };
算法3:其实这个和组合数有关,对于m*n的网格,从左上角走到右下角,总共需要走m+n-2步,其中必定有m-1步是朝右走,n-1步是朝下走,那么这个问题的答案就是组合数:
, 这里需要注意的是求组合数时防止乘法溢出 本文地址
class Solution { public: int uniquePaths(int m, int n) { return combination(m+n-2, m-1); } int combination(int a, int b) { if(b > (a >> 1))b = a - b; long long res = 1; for(int i = 1; i <= b; i++) res = res * (a - i + 1) / i; return res; } };
Unique Paths II
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.
这一题可以完全采用和上一题一样的解法,只是需要注意dp的初始化值,和循环的起始值
class Solution { public: int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) { int m = obstacleGrid.size(), n = obstacleGrid[0].size(); vector<int>dp(n+1, 0); dp[1] = (obstacleGrid[0][0] == 0) ? 1 : 0; for(int i = 1; i <= m; i++) for(int j = 1; j <= n; j++) if(obstacleGrid[i-1][j-1] == 0) dp[j] = dp[j] + dp[j-1]; else dp[j] = 0; return dp ; } };
【版权声明】转载请注明出处:/article/4879731.html
相关文章推荐
- 【LeetCode】(63)Unique Paths II(Medium)
- leetcode--Unique Paths && Unique Paths ii
- [leetcode]Unique Paths II
- leetcode--Unique Paths && Unique Paths ii
- LeetCode Online Judge 题目C# 练习 - Unique Paths II
- LeetCode Unique Paths II
- leetcode-63 Unique Paths II
- LeetCode:Unique Paths II
- LeetCode 63: Unique Paths II
- Leetcode Unique Paths II
- leetcode Unique Paths II
- 【leetcode】Unique Paths II
- Unique Paths II - Leetcode
- 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 I && II