leetcode 題目64 最小路徑和

2021-10-03 18:18:10 字數 1747 閱讀 9171

2020/3/11  打卡

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

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

示例:輸入:

[[1,3,1],

[1,5,1],

[4,2,1]

]輸出: 7

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

找最短路徑的問題,從左上點  到  右下點。

思路 可以使用動態規劃的思想,來進行判別路徑長度,並進行累計,找到 最短長度的路徑。(是最為常用和典型的 一道動態規劃題。)

狀態定義:設 dp 為大小 m×n 矩陣,其中 dp[i][j]的值代表直到走到 (i,j)的最小路徑和。

狀態初始化:dp 初始化即可,不需要修改初始 0 值。

狀態轉移方程 基本形式為:

走到當前單元格 (i,j)的最小路徑和=「從左方單元格(i−1,j)與從上方單元格(i,j−1) 走來的兩個最小路徑和中較小的」+當前單元格值grid[i][j]

具體下來,可以分為四種情況: [非常非常典型的動態規劃思路。 很好理解]

(1)當左邊和上邊都不是矩陣邊界時: 即當i != 0,j!=0時,dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];

有兩種可能性,按照兩種情況走過來即可。從上面或者左邊走過來。自然走動過來。

(2)當只有左邊是矩陣邊界時: 只能從上面來,即當i=0,j!=0時, dp[i][j]=dp[i][j−1]+grid[i][j] ; (走在最上邊一行時,算從左邊過來的)

(3)當只有上邊是矩陣邊界時: 只能從左面來,即當i!=0,j=0時, dp[i][j]=dp[i−1][j]+grid[i][j] ; (走在最左邊一列時,算從上面過來的)

(4)當左邊和上邊都是矩陣邊界時: 即當i=0,j=0時,其實就是起點, dp[i][j]=grid[i][j];

上面演算法的 時間複雜度 o(m×n) : 遍歷整個 gridgrid 矩陣元素。

空間複雜度 o(1) : 直接修改原矩陣,不使用額外空間

def minpath(grid):

# 這裡直接在本身進行調整,所以 本身的grid形式就是 狀態的載體。 grid有長寬 非正方形的(i是行,j是列)

for i in range(len(grid)):

for j in range(len(grid[0])):

# 對於 網格中的每個位置,進行如下的 狀態轉移上的操作

# (4)如果是起點位置

if i==j==0:

continue

# (2)這個是左邊 是矩陣邊界的情況(走在最左邊一列時)

elif i==0:

grid[i][j]=grid[i][j-1]+grid[i][j]

# (3)這個是 上邊 為矩陣邊界的情況(走在最上面一行時)

elif j==0:

grid[i][j]=grid[i-1][j]+grid[i][j]

# (1)這個是動態規劃中核心 轉移部分, 走在中間位置的 狀態轉移計算情況。

else:

grid[i][j]=min(grid[i-1][j],grid[i][j-1])+grid[i][j]

# 最終返回 目標狀態位置即可

return grid[-1][-1]

LeetCode 64 最小路徑和

題目描述 提示幫助 提交記錄 社群討論 閱讀解答 隨機一題 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和...

LeetCode筆記 64最小路徑和

題目 給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小使用動態規劃的思想,並且用乙個一位陣列表示dp i...

LeetCode 64 最小路徑和

給定乙個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。說明 每次只能向下或者向右移動一步。示例 輸入 1,3,1 1,5,1 4,2,1 輸出 7 解釋 因為路徑 1 3 1 1 1 的總和最小。以輸入為 3 3 的網格為例,其中 m 3,n 3 1...