力扣62題、63題(不同路徑)
阿新 • • 發佈:2021-11-25
62、不同路徑
基本思想:
動態規劃
具體實現:
1.確定dp陣列以及下標的含義
dp[i][j]:表示從(0,0)出發,到(i,j)有dp[i][j]條不同的路徑
2.確定遞推公式
求dp[i][j],兩個方向來推導,即dp[i - 1][j] 和 dp[i][j - 1]
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
3.dp陣列的初始化
dp[i][0]都是1:從(0,0)到(i,0)的路勁只有一條
dp[0][j]同理
4.確定遍歷順序
從上方和左方推導來
5.舉例推導
程式碼:
class Solution { public int uniquePaths(intm, int n) { int[][] dp = new int[m][n]; for (int i = 0; i < m; i++) { dp[i][0] = 1; } for (int j = 0; j < n; j++){ dp[0][j] = 1; } for (int i = 1; i < m; i++){ for (int j = 1; j < n; j++){ dp[i][j]= dp[i - 1][j] + dp[i][j - 1]; } } return dp[m - 1][n - 1]; } }
優化:
class Solution { public int uniquePaths(int m, int n) { int[] dp = new int[n]; for (int j = 0; j < n; j++){ dp[j] = 1; } for (int i = 1; i < m; i++){for (int j = 1; j < n; j++){ dp[j] += dp[j - 1]; } } return dp[n - 1]; } }
63、不同路徑ii
基本思想:
在上題的基礎上,如果碰到障礙物時,dp陣列保持為初始狀態
具體實現:
1、確定dp陣列以及下標的含義
dp[i][j] :表示從(0 ,0)出發,到(i, j) 有dp[i][j]條不同的路徑。
2、確定遞推公式
dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
(i,j)如果是障礙的話,保持初始狀態
3.dp陣列初始化
先把dp陣列都初始化為0,(不過dp陣列剛建立的時候就是0)
dp[i][0]是1:從(0,0)到(i,0)的路勁只有一條
dp[0][j]同理
但是如果(i,0)這條邊有障礙之後,障礙和障礙之後都是走不到的位置,障礙之後的dp[i][0]是0
4.確定遍歷順序
從上方和左方推導
從上到下,從左到右
5.舉例
obstacleGrid = [[0,0,0],[0,1,0],[0,0,0]]
程式碼:
class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int m = obstacleGrid.length; int n = obstacleGrid[0].length; int[][] dp = new int[m][n]; dp[0][0] = 1 - obstacleGrid[0][0]; for (int i = 1; i < m; i++) { if (obstacleGrid[i][0] == 0 && dp[i-1][0] == 1) dp[i][0] = 1; } for (int i = 1; i < n; i++) { if (obstacleGrid[0][i] == 0 && dp[0][i-1] == 1) dp[0][i] = 1; } for (int i = 1; i < m; i++){ for (int j = 1; j < n; j++){ if (obstacleGrid[i][j] == 1) continue; dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; } } return dp[m - 1][n - 1]; } }