描述給定乙個只含非負整數的m*n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。思路利用動態規劃思想解決問題,動態規劃的思想是將乙個問題分為若干子問題,通過解決所有子問題來解決整個問題。並且為了節約執行時間,需將每個子問題的結果進行儲存,以防重複計算帶來的時長浪費。樣例
example 1:
input: [[1,3,1],[1,5,1],[4,2,1]]
output: 7
example 2:
input: [[1,3,2]]
output: 6
根據題意,從矩陣(二維陣列)左上角僅通過向右或下運動到達右下角,這即為總問題。那麼矩陣中的元素大致可分為三類,這是需要處理的三類子問題:
所以只要分別解決到達以上三類所有位置的最小路徑,並將每乙個元素所需的最短到達路徑計入另乙個矩陣,那麼即可得到所有元素的最短路徑,也就得到了結果。那麼計算三類的最短路徑,分別具有如下的遞推公式:
# 矩陣第一行的元素
minpathmatrix[i]
[j]+= minpathmatrix[i]
[j-1
]# 矩陣第一列的元素
minpathmatrix[i]
[j]+= minpathmatrix[i-1]
[j]# 矩陣其他位置元素
minpathmatrix[i]
[j]+=
min(minpathmatrix[i]
[j-1
],minpathmatrix[i-1]
[j])
利用以上的遞推公式結合下圖的通俗解釋,即可編寫相應程式:
步驟
返回最短路徑矩陣的右下角元素
def
minpathsum
(grid)
: len_row =
len(grid)
len_column =
len(grid[0]
) minpathmatrix = grid
for i in
range
(len_row)
:for j in
range
(len_column)
:if i ==
0and j ==0:
continue
elif i ==
0and j !=0:
minpathmatrix[i]
[j]+= minpathmatrix[i]
[j-1
]elif i !=
0and j ==0:
minpathmatrix[i]
[j]+= minpathmatrix[i-1]
[j]else
: minpathmatrix[i]
[j]+=
min(minpathmatrix[i]
[j-1
],minpathmatrix[i-1]
[j])
return minpathmatrix[len_row-1]
[len_column-
1]
lintcode練習 110 最小路徑和
給定乙個只含非負整數的m n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。你在同一時間只能向下或者向右移動一步 解題思路 1,3,5,7,9 5,2,8,5,1 4,4,7,2,3 3,6,6,1,1 2,8,5,0,4 1 假設上面為m n的網格,因為只能向下或者向右,所以第一行和第一列...
LintCode 110 最小路徑和
給定乙個只含非負整數的m n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。樣例 1 輸入 1,3,1 1,5,1 4,2,1 輸出 7 樣例解釋 路線為 1 3 1 1 1。樣例 2 輸入 1,3,2 輸出 6 解釋 路線是 1 3 2你在同一時間只能向下或者向右移動一步 public c...
lintcode 110最小路徑和
最小路徑和 給定乙個只含非負整數的m n網格,找到一條從左上角到右下角的可以使數字和最小的路徑。注意事項 你在同一時間只能向下或者向右移動一步 您在真實的面試中是否遇到過這個題?yes樣例 標籤 動態規劃 相關題目 1 dynamic programming 容易 數字三角形 26 2 dynami...