您的位置:首页 > 产品设计 > UI/UE

Unique Paths II

2017-11-03 17:16 288 查看
原题链接: https://leetcode.com/problems/unique-paths-ii/description/

题目描述: 题目在Unique Path这道题目的基础上增加了一个条件,给定一个m*n的障碍矩阵obstacleGrid,当obstacleGrid[i][j]的值为0时,代表方格(i,j)上没有障碍物;为1时代表方格(i, j)上有障碍物,必须绕开这个障碍物。找出从方格(0,0)到(m-1, n-1)的所有路径的数量。

Solution: 采用动态规划的方法,用path[i][j]表示从方格(0,0)到(i, j)的所有路径的数量。对于每一个方格(i, j),到达此方格的路径数量应该等于其上方方格(i-1, j)与左边方格(i, j-1)的路径数量之和,因为题目要求只能向右或向下走。依次计算出所有方格的path值,那么path[m-1][n-1]就是问题的解。

该问题的状态转移方程为:

当 i=0, j=0时,若方格(0,0)中有障碍,则path[0][0] = 0;若方格无障碍,则path[0][0] = 1。

当 i > 0 或 j > 0时,若方格(i,j)有障碍,则path[i][j] = 0;若方格无障碍,则path[i][j] = path[i][j-1] + path[i-1][j]。

class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
int unique_path[m]
;
memset(unique_path, 0, sizeof(unique_path));

unique_path[0][0] = obstacleGrid[0][0] == 1 ? 0 : 1;

for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (obstacleGrid[i][j] == 0) {
if (i > 0) unique_path[i][j] += unique_path[i-1][j];
if (j > 0) unique_path[i][j] += unique_path[i][j-1];
}
}
}

return unique_path[m-1][n-1];
}
};


算法分析: 一共有m*n个方格,所以状态数位m x n,状态迁移的复杂度为O(1),所以总的复杂度为O(m x n)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: