LeetCode 不同路徑問題

2021-09-29 18:34:34 字數 4062 閱讀 8075

62. 不同路徑

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。

機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。

問總共有多少條不同的路徑?

例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?

說明:m 和 n 的值均不超過 100。

示例 1:

輸入: m = 3, n = 2

輸出: 3

解釋:從左上角開始,總共有 3 條路徑可以到達右下角。

向右 -> 向右 -> 向下

向右 -> 向下 -> 向右

向下 -> 向右 -> 向右

示例 2:

輸入: m = 7, n = 3

輸出: 28

思路:動態規劃

自底向上的演算法,當到達finnish之前,總共有兩格可以一步到達finnish,所以只需要將到達這兩格的路徑數加起來就可以了,縱觀全圖,每個所到達格仔的路徑數就是與他相鄰的左邊的格仔的路徑數加上到達上邊的格仔的路徑數;

所以將整個網格看做乙個二維陣列,每個位置儲存的既是到達此位置的路徑數;

因為最上邊的格仔和最下邊的格仔無論如何都只有一條路線,所以先初始化第一行和第一列為1;

由此,dp方程為:

dp[i,j]

= dp[i-

1,j]

+ dp[i,j-1]

;

**:時間複雜度o(mn) 空間複雜度o(mn)

public

intuniquepaths

(int m,

int n)

for(

int i =

0; i < m; i++

)for

(int i =

1; i < m; i++)}

return result[m -1]

[n -1]

;}

優化,用乙個一維陣列儲存每行的當前陣列

時間複雜度為o(m*n)

空間複雜度為o(n)

public

intuniquepaths2

(int m,

int n)

}return cur[n -1]

;}

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代表障礙物,初始化之後0代表到達不了(因為初始化之後數值代表的是到達所在格仔的路徑和)

dp方程不變,只是當遇到障礙物時,直接置0

public

intuniquepathswithobstacles

(int

obstaclegrid)

obstaclegrid[0]

[0]=

1;for(

int i =

1; i < r; i++

)for

(int i =

1; i < c; i++

)for

(int i =

1; i < r; i++

)else}}

return obstaclegrid[r -1]

[c -1]

;}

64. 最小路徑和給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例:

輸入:[[

1,3,

1],[

1,5,

1],[

4,2,

1]]輸出:

7解釋: 因為路徑 1→3→1→1→1 的總和最小。

思路:自底向下,新建乙個和原陣列一樣大小的二維陣列,每個元素代表到finnish的最小路徑權值,finnish位置初始為原陣列元素大小,每個元素值等於當前所在格仔的權值加上其右邊和下邊中較小者;

最後一行與最後一列的初始化為,權值加上上乙個格仔的值(累加)

dp方程:

dp[i,j]

= grid[i,j]

+ math.

min(dp[i+

1,j]

, dp[i,j+1]

);

**:

public

intminpathsum1

(int

grid)

else

if(j == grid[0]

.length -

1&& i != grid.length -1)

else

if(j != grid[0]

.length -

1&& i != grid.length -1)

else}}

return dp[0]

[0];

}

dp[j]

= grid[i,j]

+ math.

min(dp[j]

,dp[j+1]

)

**:

public

intminpathsum2

(int

grid)

else

if(j == grid[0]

.length -

1&& i != grid.length -1)

else

if(j != grid[0]

.length -

1&& i != grid.length -1)

else}}

return dp[0]

;}

不需要額外的空間優化直接在原有的二維陣列上改

**:

public

intminpathsum3

(int

grid)

else

if(j == grid[0]

.length -

1&& i != grid.length -1)

else

if(j != grid[0]

.length -

1&& i != grid.length -1)

}}return grid[0]

[0];

}

不同路徑(LeetCode)

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 問總共有多少條不同的路徑?例如,上圖是乙個7 x 3 的網格。有多少可能的路徑?說明 m 和 n 的值均不超過 100。示例 ...

不同路徑(leetcode)

題目 物體怎樣從左上角移動到右下角,其中1表示有障礙,不能行走。思路 知道整個方框的行和列。對第一行和第一列進行填充1,當碰到1 障礙 填充0。本題可以被視為乙個動態規劃的問題,從上到下,從左到右,其中到達乙個終點的路徑總是左邊路徑 上面路徑。即 d p i j dp i 1 j dp i j 1 ...

leetcode不同路徑

1.深度優先搜尋 從finish點開始,往回走,每次是往上走,往右走,當回到0,0點時,路徑數量加1 如下 class solution void dfs int m,int n,int r,int c 但是這種方法可能會超時 2.利用數學公式 地圖矩陣為m行,n列,從左上角到右下角一共需要走m n...