1. 程式人生 > 其它 >力扣62題、63題(不同路徑)

力扣62題、63題(不同路徑)

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(int
m, 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];
    }
}