MENU

LeetCode63. Unique Paths II(动态规划)

2019 年 04 月 01 日 • 阅读: 1082 • LeetCode阅读设置

LeetCode63. Unique Paths II(动态规划)

  • Medium
  • Accepted:189,636
  • Submissions:569,901

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).

Now consider if some obstacles are added to the grids. How many unique paths would there be?

img

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

Note: m and n will be at most 100.

Example 1:

Input:
[
  [0,0,0],
  [0,1,0],
  [0,0,0]
]
Output: 2
Explanation:
There is one obstacle in the middle of the 3x3 grid above.
There are two ways to reach the bottom-right corner:
1. Right -> Right -> Down -> Down
2. Down -> Down -> Right -> Right

链接

https://leetcode.com/problems/unique-paths-ii

题意

问n*m的方格从左上角到右下角有多少条不同的路径,每次可以往右或者往下走,其中1代表障碍物,不能通行,0可以通行。

题解

在之前的问题:LeetCode62. Unique Paths(动态规划)上添加了障碍物这一属性,所以我们需要判断当前方格是否有障碍物。

首先预处理一下首行和首列,如果出现一个方格有障碍物,那么后面的方格都无法通行了。

然后两层循环得到递归式ans[i][j] = (obstacleGrid[i][j] == 0) ? ans[i - 1][j] + ans[i][j - 1] : 0;的答案。

时间复杂度$O(nm)$,空间复杂度$O(nm)$,当然可以把空间复杂度优化到线性。

同时注意更新了测试数据,需要使用long long。

代码

  • Runtime: 4 ms, faster than 100.00% of C++ online submissions for Unique Paths II.
  • Memory Usage: 9.3 MB, less than 29.41% of C++ online submissions for Unique Paths II.
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n = obstacleGrid.size(), m = obstacleGrid[0].size();
        vector <vector <long long> > ans(n + 1, vector <long long> (m + 1, 0));
        for (int i = 0; i < m; ++i)
        {
            if (obstacleGrid[0][i] == 1)
                break;
             ans[0][i] = 1;
        }
        for (int i = 0; i < n; ++i)
        {
             if (obstacleGrid[i][0] == 1)
                break;
             ans[i][0] = 1;
        }
        for (int i = 1; i < n; ++i)
        {
            for (int j = 1; j < m; ++j)
                ans[i][j] = (obstacleGrid[i][j] == 0) ? ans[i - 1][j] + ans[i][j - 1] : 0;
        }
        return ans[n - 1][m - 1];
    }
};

数据

[[0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1],[0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0],[1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,1],[0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0],[0,0,0,1,0,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0],[1,0,1,1,1,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,1,0],[0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,1,0,0,0,0,0],[0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0],[1,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,0,1],[0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,1,1,0,0,0,0,0],[0,1,0,1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0,0],[0,1,0,0,0,0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,0,1],[1,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,1,1,0,0,1,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,1,1,0,1,0,0,0,0,1,1],[0,1,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,0,1,0,1],[1,1,1,0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1],[0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,1,0,0,0]]

// 1637984640

The end.
2019年4月1日 星期一
最后编辑于: 2019 年 04 月 03 日