Unique Paths Java

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

How many possible unique paths are there?


Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.


There are 3 Approaches to solve this problem

1. Naive Solution: Recursion 

This is most obviously one, but not good enough to AC in LeetCode

 public int uniquePathsNaive(int m, int n) {

        return helper(1,1,m,n);
    }
    private static int helper(int i,int j,int m,int n){
        if(i>m || j>n) return 0;
        if(i==m && j==n) return 1;

        return helper(i+1,j,m,n) +helper(i,j+1,m,n);
    }

2.  Better Solution:

Key to solve: DP
    The robot can only move down or right =>
   And the DP formula: res[i][j] =res[i-1][j]+res[i][j-1]

Time: O(m*n) Space:(m*n)

 public static int uniquePathsDP2(int m, int n) {
        //special case
        if(m==0 && n==0) return 0;
        int[][] result=new int[m][n];
        for(int i=0;i<m;i++){
            result[i][0]=1;
        }
        for (int j=0;j<n;j++){
            result[0][j]=1;
        }
        for(int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                result[i][j]=result[i-1][j]+result[i][j-1];
            }
        }
        return result[m-1][n-1];
    }


Another way to solve in DP, we only need 1D array in size of column to store  value of previous row,

     As a result, the last grid will be total of Unique Paths
     Time: O(m*n)
     Space: O(n)

public int uniquePathsDP(int m, int n) {
        //special case
        if(m==0 && n==0) return 0;
        int[] result=new int[n];
        result[0]=1;
        for(int i=0;i<m;i++){
            for(int j=1;j<n;j++){
                result[j]+=result[j-1];
            }
        }
        return result[n-1];
   }


3. Best Solution: 

Covert it into Combination problem
    total steps to reach the from left-top to right-bottom is(m-1)+(n-1)
    use m-1 steps
    Thus: calculate C(m+n-2, m-1)
    Time: O(min(m,n))   Space: O(1)

public int uniquePaths(int m, int n) {
        double denominator=1;
        double domain=1;
        int small,big;
        if(m<n) {
            small = m - 1;
            big = n - 1;
        }
        else{
            small=n-1;
            big=m-1;
        }
        for(int i=1;i<=small;i++){
            denominator=denominator*i;
            domain=domain*(small+big+1-i);
        }
        return (int)(domain/denominator);
    }


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值