Table of Contents
Problem Statement
The Unique Paths II LeetCode Solution – “Unique Paths II” states that given the m x n grid where a robot starts from the top left corner of the grid. We need to find the total number of ways to reach the bottom right corner of the grid.
A cell containing an obstacle contains 1 while, 0 for a free cell.
Example:
Input: obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
Output: 2
Explanation:
- There exists an obstacle in the middle of the grid.
- There exists exactly 2 unique paths to reach from the top-left corner to bottom right corner of the matrix.
- Right, Right, Down, Down.
- Down, Down, Right, Right.
Input: obstacleGrid = [[0,1],[0,0]]
Output: 1
Explanation:
- There is exactly 1 unique path.
- Down, Right.
- Hence, 1 is our answer.
Approach
Idea:
- The main idea to solve this problem is to use dynamic programming.
- Let dp[i][j] = number of unique paths ending at this cell.
- If the current cell contains an obstacle, dp[i][j] = 0.
- If the current cell is a free cell:
- We can reach the current cell from the top cell, hence dp[i][j] += dp[i-1][j], provided the top cell exists.
- We can reach the current cell from the left cell, hence dp[i][j] += dp[i][j-1], provided the left cell exists.
- Finally, our answer is dp[n-1][m-1].
Code
Unique Paths II Leetcode C++ Solution:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
int n = obstacleGrid.size(),m = obstacleGrid.back().size();
vector<vector<int>> dp(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0 and j==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = 1;
}
}
else if(i==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i][j-1];
}
}
else if(j==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i-1][j];
}
}
else{
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
}
return dp[n-1][m-1];
}
};Unique Paths II Leetcode Java Solution:
class Solution {
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
int n = obstacleGrid.length;
int m = obstacleGrid[0].length;
int[][] dp = new int[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(i==0 && j==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = 1;
}
}
else if(i==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i][j-1];
}
}
else if(j==0){
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i-1][j];
}
}
else{
if(obstacleGrid[i][j]==0){
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
}
}
return dp[n-1][m-1];
}
}Complexity Analysis for Unique Paths II Leetcode Solution
Time Complexity
The time complexity of the above code is O(N*M) where N = number of rows and M = number of columns.
Since we traversed the entire input matrix at least once, Time Complexity is O(N*M).
Space Complexity
The space complexity of the above code is O(N*M). We need a dynamic programming matrix of size N*M to store all intermediate values.
Reference: https://en.wikipedia.org/wiki/Dynamic_programming