1. 程式人生 > >【LeetCode-演算法】63. 不同路徑 II(Java實現)

【LeetCode-演算法】63. 不同路徑 II(Java實現)

題目

一個機器人位於一個 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. 向下 -> 向下 -> 向右 -> 向右

解題思路: 使用動態規劃的思想來解決本題

程式碼實現:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        // 使用動態規劃的演算法思想進行求解                                   
        if (obstacleGrid == null || obstacleGrid.length == 0                                 
                || obstacleGrid[0].length ==
0) { return 0; } if (obstacleGrid[0][0] != 0 ||
obstacleGrid[obstacleGrid.length - 1][obstacleGrid[0].length - 1] != 0) { return 0; } int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length]; dp[0][0] = 1; for (int j = 1; j < obstacleGrid[0].length; j++) { if (obstacleGrid[0][j] == 0 && dp[0][j - 1] == 1) dp[0][j] = 1; } for (int i = 1; i < obstacleGrid.length; i++) { if (obstacleGrid[i][0] == 0 && dp[i - 1][0] == 1) dp[i][0] = 1; } for (int i = 1;i < obstacleGrid.length;i++) { for (int j = 1; j < obstacleGrid[i].length; j++) { if (obstacleGrid[i][j] == 0) { dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } } return dp[obstacleGrid.length][obstacleGrid[0].length - 1]; } }