【LeetCode-演算法】63. 不同路徑 II(Java實現)
阿新 • • 發佈:2018-12-20
題目
一個機器人位於一個 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];
}
}