-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
73 lines (67 loc) · 2.33 KB
/
main.cpp
File metadata and controls
73 lines (67 loc) · 2.33 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Source: https://leetcode.com/problems/unique-paths-ii
// Title: Unique Paths II
// Difficulty: Medium
// Author: Mu Yang <http://muyang.pro>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// You are given an `m x n` integer array `grid`. There is a robot initially located at the *top-left corner* (i.e., `grid[0][0]`). The robot tries to move to the **bottom-right corner** (i.e., `grid[m - 1][n - 1]`). The robot can only move either down or right at any point in time.
//
// An obstacle and space are marked as `1` or `0` respectively in `grid`. A path that the robot takes cannot include **any** square that is an obstacle.
//
// Return the number of possible unique paths that the robot can take to reach the bottom-right corner.
//
// The testcases are generated so that the answer will be less than or equal to `2 * 10^9`.
//
// **Example 1:**
//
// https://assets.leetcode.com/uploads/2020/11/04/robot1.jpg
//
// ```
// Input: obstacleGrid = [[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
// ```
//
// **Example 2:**
//
// https://assets.leetcode.com/uploads/2020/11/04/robot2.jpg
//
// ```
// Input: obstacleGrid = [[0,1],[0,0]]
// Output: 1
// ```
//
// **Constraints:**
//
// - `m == obstacleGrid.length`
// - `n == obstacleGrid[i].length`
// - `1 <= m, n <= 100`
// - `obstacleGrid[i][j]` is `0` or `1`.
//
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <cstdint>
#include <vector>
using namespace std;
// Use 1D-DP
//
// Start from bottom right
// dp[i, j] = dp[i+1, j] + dp[i, j+1] if (i, j) not obstacle
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int m = obstacleGrid.size(), n = obstacleGrid[0].size();
// DP
auto curr = vector<int64_t>(n + 1);
auto prev = vector<int64_t>(n + 1);
curr[n - 1] = 1;
for (auto i = m - 1; i >= 0; --i) {
swap(curr, prev);
for (auto j = n - 1; j >= 0; --j) {
curr[j] = (obstacleGrid[i][j] == 1) ? 0 : (prev[j] + curr[j + 1]);
}
}
return curr[0];
}
};