LeetCode_#62#63_不同路徑
阿新 • • 發佈:2020-07-17
LeetCode_#62#63_不同路徑
劍指offerContents
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];
}
}