Leetcode 063 不同路径|| Python C++ 详细题解
2018-07-30 15:28
435 查看
题目:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?
网格中的障碍物和空位置分别用
1和
0来表示。
说明:m 和 n 的值均不超过 100。
示例 1:
输入: [ [0,0,0], [0,1,0], [0,0,0] ] 输出: 2 解释: 3x3 网格的正中间有一个障碍物。 从左上角到右下角一共有 [code]2条不同的路径: 1. 向右 -> 向右 -> 向下 -> 向下 2. 向下 -> 向下 -> 向右 -> 向右[/code]
既然题目提示用dp来做,那就按它的意思来好了,毕竟它的上一道同类型的题也是可以用dp做的。
算法过程:
这道题不同就在于有个障碍物,对于障碍物,我们是永远到不了的,所以设置它的dp的值为0。接下来就是一样的操作罢了。
Python:
[code]class Solution: def uniquePathsWithObstacles(self, obstacleGrid): """ :type obstacleGrid: List[List[int]] :rtype: int """ m = len(obstacleGrid) if m == 0: return 0 n = len(obstacleGrid[0]) dp = [[0 for _ in range(n)] for _ in range(m)] #先把横行和竖行填好 for i in range(m): if obstacleGrid[i][0] != 1: dp[i][0] = 1 else:#遇到障碍物就跳出,因为后面的都是0 break for i in range(n): if obstacleGrid[0][i] != 1: dp[0][i] = 1 else: break #开始填最大的部分 for i in range(1, m): for j in range(1, n): #不是障碍物才填 #是障碍物的话默认以及为0了 if obstacleGrid[i][j] != 1: dp[i][j] = dp[i-1][j]+dp[i][j-1] #返回最后一个值 return dp[m-1][n-1]
这里因为本人最近在自学C++,所以补充C++的代码:
[code] class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { if (obstacleGrid.empty() || obstacleGrid[0].empty() || obstacleGrid[0][0] == 1) return 0; vector<vector<int> > dp(obstacleGrid.size(), vector<int>(obstacleGrid[0].size(), 0)); for (int i = 0; i < obstacleGrid.size(); ++i) { for (int j = 0; j < obstacleGrid[i].size(); ++j) { //遇到障碍物设为0 if (obstacleGrid[i][j] == 1) dp[i][j] = 0; //一开始的点设为1 else if (i == 0 && j == 0) dp[i][j] = 1; //等于上一项,其实也就是等于1或者0,与pythoN代码效果相同 else if (i == 0 && j > 0) dp[i][j] = dp[i][j - 1]; else if (i > 0 && j == 0) dp[i][j] = dp[i - 1][j]; //动态转移方程 else dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp.back().back(); } };
思路比较简单,这里就不啰嗦太多了。
阅读更多相关文章推荐
- Leetcode 82 删除排序链表中的重复元素 II Python C++ 史上最详细题解系列
- Leetcode 072 编辑距离 Python C++ 史上最详细题解系列
- Leetcode 074 探索二维矩阵 Python C++ 史上最详细题解系列
- Leetcode 073 矩阵置零 Python C++ 史上最详细题解系列
- Leetcode 078 子集 Python C++ 史上最详细题解系列
- Leetcode 079 搜索单词 Python C++ 史上最详细题解系列
- Leetcode 83 删除排序链表中的重复元素 Python C++ 史上最详细题解系列
- Leetcode 80 删除排序数组中的重复项 II Python C++ 史上最详细题解系列
- Leetcode 077 组合 Python C++ 史上最详细题解系列
- Leetcode 81 搜索旋转排序数组 II Python C++ 史上最详细题解系列
- Leetcode 075 颜色分类 Python C++ 史上最详细题解系列(多解法)
- Leetcode 076 最小覆盖子串 Python C++ 史上最详细题解系列
- [LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
- Leetcode 071 简化路径 Python C++
- [LeetCode]题解(python):063-Unique Paths II
- LeetCode题解汇总(C++ Java Python,含题目翻译)
- Leetcode 312 打气球 Burst Balloons C++ 史上最详细题解系列
- leetcode_效率题解_[python/C++]_147. Insertion Sort List(链表插入排序)
- leetcode_效率题解_[python/C++]_21. Merge Two Sorted Lists(合并2个有序链表)