LeetCode 63. Unique Paths II(唯一出路Ⅱ)
2018-03-24 16:45
148 查看
题目描述:
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.[
[0,0,0],
[0,1,0],
[0,0,0]
]
The total number of unique paths is
Note: m and n will be at most 100.
分析:
题意:给定一个m x n 二维地图(元素0代表空格、元素1代表障碍),左上角为起点,右下角为终点,一个机器人只能往下、往右走。返回到达终点所有不重复的路径条数。
思路:这道题是LeetCode 62的进化版本,我们采用动态规划的方法:我们构造数组dp[m]
,dp[i][j]表示从位置(0, 0)到达位置(i, j)的路径条数。初始化各元素值为0(其中dp[0][0] = 1,dp[i][0] = 1(i∈1→m - 1,出现该列元素为1之前),dp[0][j] = 1(j∈1→n - 1,出现该行元素为1之前)),那么对于位置(i, j),根据题意,Ⅰ. 如果地图对应值为0,那么只能从其上方或者左侧移动过来两种可能;Ⅱ. 如果地图对应值为1,说明是障碍,方式为0种。因此状态转移方程为:
dp[i][j] = (obstacleGrid[i][j] == 0)? dp[i - 1][j] + dp[i][j - 1]: 0。
时间复杂度为O(m * n)。
代码:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
// Exceptional Case:
if(obstacleGrid.empty()){
return 0;
}
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1){
return 0;
}
// create
vector<vector<int>> dp(m, vector<int>(n, 0));
// init
dp[0][0] = 1;
int pos = 1;
while(pos <= n - 1 && obstacleGrid[0][pos] == 0){
dp[0][pos] = 1;
pos++;
}
pos = 1;
while(pos <= m - 1 && obstacleGrid[pos][0] == 0){
dp[pos][0] = 1;
pos++;
}
// dp
for(int i = 1; i <= m - 1; i++){
for(int j = 1; j <= n - 1; j++){
dp[i][j] = (obstacleGrid[i][j] == 0)? dp[i - 1][j] + dp[i][j - 1]: 0;
}
}
// get answer
return dp[m - 1][n - 1];
}
};
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.
分析:
题意:给定一个m x n 二维地图(元素0代表空格、元素1代表障碍),左上角为起点,右下角为终点,一个机器人只能往下、往右走。返回到达终点所有不重复的路径条数。
思路:这道题是LeetCode 62的进化版本,我们采用动态规划的方法:我们构造数组dp[m]
,dp[i][j]表示从位置(0, 0)到达位置(i, j)的路径条数。初始化各元素值为0(其中dp[0][0] = 1,dp[i][0] = 1(i∈1→m - 1,出现该列元素为1之前),dp[0][j] = 1(j∈1→n - 1,出现该行元素为1之前)),那么对于位置(i, j),根据题意,Ⅰ. 如果地图对应值为0,那么只能从其上方或者左侧移动过来两种可能;Ⅱ. 如果地图对应值为1,说明是障碍,方式为0种。因此状态转移方程为:
dp[i][j] = (obstacleGrid[i][j] == 0)? dp[i - 1][j] + dp[i][j - 1]: 0。
时间复杂度为O(m * n)。
代码:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
// Exceptional Case:
if(obstacleGrid.empty()){
return 0;
}
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
if(obstacleGrid[0][0] == 1 || obstacleGrid[m - 1][n - 1] == 1){
return 0;
}
// create
vector<vector<int>> dp(m, vector<int>(n, 0));
// init
dp[0][0] = 1;
int pos = 1;
while(pos <= n - 1 && obstacleGrid[0][pos] == 0){
dp[0][pos] = 1;
pos++;
}
pos = 1;
while(pos <= m - 1 && obstacleGrid[pos][0] == 0){
dp[pos][0] = 1;
pos++;
}
// dp
for(int i = 1; i <= m - 1; i++){
for(int j = 1; j <= n - 1; j++){
dp[i][j] = (obstacleGrid[i][j] == 0)? dp[i - 1][j] + dp[i][j - 1]: 0;
}
}
// get answer
return dp[m - 1][n - 1];
}
};
相关文章推荐
- 重度垂直是汽车后市场O2O唯一的出路吗
- 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】
- LeetCode 62. Unique Paths(唯一路线)
- 移动特性并非唯一出路,LBS 还能怎么玩?
- [LeetCode] 62. Unique Paths 唯一路径
- [Leetcode] Unique binary search trees 唯一二叉搜索树
- LeetCode 95. Unique Binary Search Trees II(唯一二叉搜索树)
- leetcode--TWO SUM延伸(假设答案不唯一、假设输入有相同数字)
- 【LeetCode】96. Unique Binary Search Trees-唯一二叉排序树的个数
- [LeetCode] 96. Unique Binary Search Trees 唯一二叉搜索树
- 技术不是唯一出路
- 浅谈协同软件唯一的出路在于定制化OA
- leetcode_136 Single Number-找数组中唯一的单身数
- 【LeetCode-面试算法经典-Java实现】【096-Unique Binary Search Trees(唯一二叉搜索树)】
- 奋起之时,Ceph之父Sage Weil来华:产品化是唯一出路
- LeetCode18--4Sum--数组中某四个元素之和为某个输入的数值,输出这四个元素的值,并且这个四元组唯一
- [LeetCode] 95. Unique Binary Search Trees II 唯一二叉搜索树 II
- 如果你的资源贫乏,那么专注做好一件事将是你的唯一出路(no reading yet)
- 改变是成功的唯一出路