DP #62 Unique Paths

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

class Solution {

    public int uniquePaths(int m, int n) {

        int[][] dp = new int[m][n];
        // recur(m-1,n-1, dp);
        // return dp[m-1][n-1];
        return tabOpt(m,n);
    }

    // Tabulation Space Optimised Solution
    int tabOpt(int m, int n){
        int[] prev = new int[n];
        Arrays.fill(prev,1);

        for(int i=1; i<m; i++){
            int[] cur = new int[n];
            cur[0]=1;

            for(int j=1; j<n; j++){
                cur[j] = cur[j-1] + prev[j];
            }
            prev = cur;
        }
        return prev[n-1];
    }

    // Tabulation Solution
    int tab(int m, int n){
        int[][] dp = new int[m][n];
        for(int i=0; i<n; i++) dp[0][i]=1;
        for(int i=0; i<m; i++) dp[i][0]=1;

        for(int i=1; i<m; i++){
            for(int j=1; j<n; j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }

    // Recursion Memoization Solution
    int recur(int i, int j, int[][] dp){
        if(i == 0 && j == 0) return dp[i][j] = 1;
        if(i < 0 || j < 0) return 0;

        dp[i][j] = recur(i-1, j, dp) + recur(i, j-1, dp);
        return dp[i][j];
    }
}