1 題目描述
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。
說明:每次只能向下或者向右移動一步。
示例:
輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 因爲路徑 1→3→1→1→1 的總和最小。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/minimum-path-sum
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法:動態規劃
解析思路來自於大佬的鏈接:最小路徑和 (動態規劃,規範流程,清晰圖解)
3 解決代碼
- 方法:動態規劃《Java代碼》
class Solution {
public int minPathSum(int[][] grid) {
for(int i = 0; i < grid.length; i++){
for(int j = 0; j < grid[0].length; j++){
if(i == 0 && j ==0) continue;
//j= 0,爲第一行,只能從左邊來
if(j == 0){
grid[i][j] = grid[i - 1][j] + grid[i][j];
}
//i=0,爲第一列,只能從上邊來
else if(i == 0){
grid[i][j] = grid[i][j - 1] + grid[i][j];
}
//否則就是中間元素,取上邊和左邊的最小值相加
else{
grid[i][j] = Math.min(grid[i-1][j], grid[i][j-1]) + grid[i][j];
}
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}
- 方法:動態規劃《python代碼》
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
for i in range(0, len(grid)):
for j in range(0, len(grid[0])):
if i == 0 and j == 0:
continue
if j == 0:
grid[i][j] = grid[i - 1][j] + grid[i][j]
elif i == 0:
grid[i][j] = grid[i][j - 1] + grid[i][j]
else:
grid[i][j] = min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j]
return grid[len(grid) - 1][len(grid[0])- 1]