1. 程式人生 > 實用技巧 >LeetCode_#62#63_不同路徑

LeetCode_#62#63_不同路徑

LeetCode_#62#63_不同路徑

劍指offer

Contents

LeetCode_#62_不同路徑

題目

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
問總共有多少條不同的路徑?

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
示例1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

示例2:

輸入: m = 7, n = 3
輸出: 28

提示:
1 <= m, n <= 100
題目資料保證答案小於等於 2 * 10 ^ 9

思路分析

動態規劃。
狀態定義:
dp[i][j]表示從座標[0,0][i,j]的路徑總數。
初始狀態:

dp[0][0] = 1

狀態轉移方程:

dp[i][j] = dp[i-1][j] + dp[i][j - 1] (i,j≠0)
dp[i][j] = dp[i-1][j] (i ≠ 0,j = 0)
dp[i][j] = dp[i][j - 1] (i = 0,j ≠0)

返回值:

dp[rows - 1][cols - 1]

解答

編碼時需要注意,函式引數m,n分別代表列數和行數,不要弄反,可以重新用rows,cols變量表示,更加清晰。

class Solution {
    public int uniquePaths(int m, int n) {
        int rows = n;
        int cols = m;
        int[][] dp = new int[rows][cols];
        //初始化為1
        dp[0][0] = 1;
        for(int i = 0;i <= rows - 1;i++){
            for(int j = 0
; j<= cols - 1;j++){ if(i == 0 && j == 0) continue; if(i == 0 && j != 0) dp[i][j] = dp[i][j - 1]; else if(i != 0 && j == 0) dp[i][j] = dp[i - 1][j]; else dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp[rows - 1][cols - 1]; } }

LeetCode_#63_不同路徑II

題目

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?
網格中的障礙物和空位置分別用 1 和 0 來表示。
說明:m和 n 的值均不超過 100。
示例1:

輸入:
[
 [0,0,0],
 [0,1,0],
 [0,0,0]
]
輸出: 2
解釋:
3x3 網格的正中間有一個障礙物。
從左上角到右下角一共有 2 條不同的路徑:
1. 向右 -> 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右 -> 向右

思路分析

#62題相比,僅僅是增加了一個可能會有障礙的設定。處理也很簡單,就是在dp陣列中,將障礙所在位置設定為0。

解答

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int rows = obstacleGrid.length;
        int cols = obstacleGrid[0].length;
        //障礙如果在起點或者終點,直接返回0
        if(obstacleGrid[0][0] == 1 || obstacleGrid[rows - 1][cols - 1] == 1)
            return 0;
        int[][] dp = new int[rows][cols];
        dp[0][0] = 1;
        for(int i = 0;i <= rows - 1;i++){
            for(int j = 0;j <= cols - 1;j++){
                //dp陣列中,將有障礙的位置設定為0
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else if(i == 0 && j != 0){
                    dp[i][j] = dp[i][j - 1];
                }else if(i != 0 && j == 0){
                    dp[i][j] = dp[i - 1][j];
                }else if(i != 0 && j != 0){
                    dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
                }
            }
        }
        return dp[rows - 1][cols - 1];
    }
}