Unique Paths & Unique Paths II

思考:

  • Unique Path 可以用動態規劃和排列組合解
  • Unique Path II 可以用動態規劃

想法

  • 1、對與問題一,排列組合考慮,要走到重點總共有n+m-2步,其中m-1步down和n-1步right,如果在m*n的方格內,選擇m-1個down,那麼剩下n-1步已經確定,並且唯一確定。所以問題一的解爲Cn1n+m2 。動態規劃可以理解爲dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。當然,因爲只用到上一循環的結果,故可以用一維數組解。
  • 2、問題二類似問題一的動態規劃解法。

代碼

問題一

解法一 排列組合
public class Solution {
    public int uniquePaths(int m, int n) {
        long path = 1;
        long rem = 1;
        int max = m > n? m: n;
        for(int i = max; i < m + n - 1; i++){
             path *= i;
             rem *= (i - max + 1);
        }
        return (int)(path / rem);
    }
}
解法二 動態規劃
public class Solution {
    public int uniquePaths(int m, int n) {
        int[] dp = new int[n];   
        for(int i = 0; i < n ; i++)
            dp[i] = 1;
        for(int i = 1; i < m; i++)
            for(int j = 1; j < n; j++)
                dp[j] = dp[j] + dp[j - 1];  
        return dp[n - 1];
    }
}

問題二

public class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {

        if(obstacleGrid.length < 1 || obstacleGrid[0].length < 1 
        ||  obstacleGrid[0][0] == 1)
            return 0;

        int n = obstacleGrid.length;

        int[] dp = new int[m];

        dp[0] = 1;

        for(int j = 1; j < m; j++)
            dp[j] = obstacleGrid[0][j] == 0? dp[j - 1]: 0;

        for(int i  = 1; i < n; i++){
            dp[0] = obstacleGrid[i][0] == 0? dp[0]: 0;
            for(int j = 1; j < m; j++)
                dp[j] = obstacleGrid[i][j] == 0? dp[j] + dp[j - 1]: 0;
        }
        return dp[m - 1];
    }
}
發佈了29 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章