LeetCode 62 不同路徑(DP)

2021-10-04 23:37:19 字數 2543 閱讀 3938

本題目算是面試比較常見的了,主要考察對演算法的理解,最優的解法是動態規劃,本篇寫一下本題的動態規劃思路和解法。

題目描述

乙個機械人位於乙個 m x n 網格的左上角(起始點為圖中的 「start」),機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(圖中標記為 「finish」)。問總共有多少條不同的路徑?

示例一:

輸入:m = 3, n = 2

輸出:3

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

向右 -> 向右 -> 向下

向右 -> 向下 -> 向右

向下 -> 向右 -> 向右

示例二:

輸入:m = 7, n = 3

輸出:28

題解思路

暴力法:使用 dfs 遍歷,從 (1,1)-> (m, n),當到達右下角時,計數加一,直到遍歷結束。只能解決一部分用例,會執行超時,時間複雜度 o(n^2)

動態規劃:開闢新的狀態空間,儲存每個點的狀態值,該狀態值表示到達該點所能走的路數。最終到達右下角時,該點所記錄的路數就是總共的不同路徑數。因為只需要遍歷一次二維陣列的狀態值,因此時間複雜度為 o(n)

dfs & dp:看到乙個有意思的題解,對 dfs 做了優化,使用狀態轉移方程去除重複計算,因此時間複雜度同 dp

dp最優解法:優化儲存空間,使用一維陣列儲存狀態。空間複雜度從 o(m x n)降到 o(n)

如何求每個點的狀態值呢?這個問題就用到了數學歸納法了,觀察可得:

當 m = 1, n = 1 時,起點不用向右和向下就已到達,路數為 1;

當 m = 1, n = 2 時,起點只能向下一步到達目標點,路數為 1;

當 m = 2, n = 1 時,起點只能向右一步到達目標點,路數為 1;

當 m = 2, n = 2 時,起點可以往右一步再往下一步,或者先往下再往右到達目標點,路數為 2;

當 m = 2, n = 3 時,起點可以往下兩步再往右一步,或者到達點(2,2)再往下一步,

而到達點(2,2)的路數為 2,因此到達目標點的路數總共 為 3;

以此類推,可以發現規律,到達點(m, n)的路數是(m - 1, n)的路數加(m, n - 1)的路數和,

即:status[m][n] = status[m - 1][n] + status[m][n-1](狀態轉移方程)

**實現

遞迴**

int status[

101]

[101]=

;int

uniquepaths

(int m,

int n)

if(m ==

1|| n ==1)

// 當該點狀態值 > 0 時,說明已經計算過路徑數,無需重複計算

if(status[m]

[n]>0)

status[m -1]

[n]=

uniquepaths

(m -

1, n)

; status[m]

[n -1]

=uniquepaths

(m, n -1)

; status[m]

[n]= status[m -1]

[n]+ status[m]

[n -1]

;return status[m]

[n];

}

迭代**
int

uniquepaths

(int m,

int n)

;int i, j;

for(i =

1; i <= m; i++

)else}}

return status[m]

[n];

}

dfs優化解法
int status[

101]

[101];

intdfs

(int x,

int y)

if(x ==

1|| y ==1)

if(status[x]

[y]>0)

status[x]

[y]=

dfs(x -

1, y)

+dfs

(x, y -1)

;return status[x]

[y];

}int

uniquepaths

(int m,

int n)

dp最優解法
int

uniquepaths

(int m,

int n)

for(i =

1; i < m; i++)}

return status[n -1]

;}

Leetcode 62 不同路徑

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

leetcode 62 不同路徑

時間複雜度o n2 def uniquepaths m,n 計算路徑的個數 memo 0 for j in range n for i in range m for i in range m for j in range n if i 0 and j 0 memo i j 1 elif j 0 me...

LeetCode 62 不同路徑

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