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...