Unique Paths

Problem Statement

There is a robot on an m x n grid. The robot is 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.

Given the two integers m and n, return the number of possible unique paths that the robot can take to reach the bottom-right corner.

The test cases are generated so that the answer will be less than or equal to 2 * 109.

Example 1:

Input: m = 3, n = 7
Output: 28

Example 2:

Input: m = 3, n = 2
Output: 3
Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Down -> Down
2. Down -> Down -> Right
3. Down -> Right -> Down

Constraints:

  • 1 <= m, n <= 100

Intuition

Approach 1: Comninatorics

Approach 2: 
Recursively find which paths reach 0,0 and return 1 if yes

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

https://www.youtube.com/watch?v=sdE0A2Oxofw&ab_channel=takeUforward

Approach 1:

Combinatorics
C++
class Solution {
public:
    int uniquePaths(int m, int n) {

        if(m == 1 || n == 1)
            return 1;
        m--;
        n--;
        if(m < n) {              // Swap, so that m is the bigger number
            swap(m,n);
        }
        long res = 1;
        int j = 1;
        for(int i = m+1; i <= m+n; i++, j++){   
            // Instead of taking factorial, keep on multiply & divide
            res *= i;
            res /= j;
        }
            
        return res;
    }
};

Approach 2:

Memoization
C++
class Solution {
public:
    int path(int i,int j, vector<vector<int>> &dp){
        if(i==0 and j==0)
            return 1;

        if(i<0 or j<0)
            return 0;

        if(dp[i][j] != -1)
            return dp[i][j];

        int l = path(i-1,j,dp);
        int r = path(i,j-1,dp);

        return dp[i][j] = l+r;
    }

    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,-1));
        dp[0][0] = 1;
        return path(m-1,n-1,dp);
    }
};

Approach 3:

Tabulation
C++
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,-1));
        dp[0][0] = 1;

        for(int i=0; i<m; i++){
            for(int j = 0; j < n; j++) {
                if(i == 0 and j == 0)   continue;
                int l=0,r=0;
                if(i>0)
                    l = dp[i-1][j];
                if(j>0)
                    r = dp[i][j-1];

                dp[i][j] = l+r;
            }
        }

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

Approach 4:

Space Optimization
C++
class Solution {
public:
    int uniquePaths(int m, int n) {
        // vector<vector<int>> dp(m,vector<int>(n,-1));
        // dp[0][0] = 1;
        vector<int> dp(n,1);
        dp[0] = 1;

        for(int i=1; i<m; i++){
            vector<int> temp(n);   
            for(int j = 0; j < n; j++) {
                if(i == 0 and j==0)   continue;
                int up=0,left=0;
                if(i>0)
                    up = dp[j];
                if(j>0)
                    left = temp[j-1];

                temp[j] = up+left;
            }
            dp  = temp;
        }

        return dp[n-1];
    }
};

Similar Problems

Last updated