給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
說明:每次只能向下或者向右移動一步。
示例:
輸入:[
[1,3,1],
[1,5,1],
[4,2,1]
]輸出: 7解釋: 因為路徑 1→3→1→1→1 的總和最小。
複製程式碼
話題:動態規劃
解題思路, 將大問題, 分解為小問題, 解題關鍵 每次只能向下或者向右移動一步。, 由"說明"可得, 任意點的路徑總和等於元素上面的值 或 元素左邊的值 再加上本身, 就是路徑總和, 在兩個路徑和中取最小的路徑,得到的就是最小路徑
1.解題
如圖所示, 這是一個二維陣列, 我們要計算到達到達右下角的最小路徑和
第一步: 建立一個大小一樣的二維陣列, 並將新陣列的左上角與求解資料的值取為一樣
第二步: 計算出新陣列中, 第一行, 第一列的值(因為第一行沒有上一行, 第一列沒有上一列, 所以他們的值是確定的 , 可以計算得出)
依次類推, 算出第一行資料
依次類推, 算出第一列資料
至此, 我們已經求解出, 第一行和第一列的值, 然後我們要求解中間的值, 中間的值會存在兩種情況, 可能和上方的值相加, 可能和左邊的值相加, 需取其小的值
如圖紅色方框所示, 有兩種情況一種 總和為 1 + 10 = 11, 另一種情況我I 1 + 14 = 15, 在兩個值的情況下, 我們取較小的值 11
,由此類推, 我們便可以計算出所有的值
最後返回 資料的最後一項, 便是路徑最小的值
程式碼如下
public int minPathSum(int[][] grid) {
int[][] arr = grid;
int width = grid[0].length;
int height = grid.length;
// 計算第一行
for (int i = 1 ; i < width ; i ++) {
arr[0][i] = grid[0][i] + arr[0][i - 1];
}
// 計算第一列
for (int i = 1 ; i < height ; i++) {
arr[i][0] = grid[i][0] + arr[i - 1][0];
}
// 計算剩餘的值
for (int i = 1 ; i < height ; i ++) {
for (int j = 1 ; j < width ; j ++) {
arr[i][j] = min(grid[i][j] + arr[i - 1][j], grid[i][j] + arr[i][j - 1]);
}
}
return arr[height - 1][width - 1];
}
// 獲取得到較小的數
public int min(int num1, int num2) {
return num1 > num2 ? num2 : num1;
}
複製程式碼