每天一道leetcode64-最小路徑和
- 2019 年 10 月 4 日
- 筆記
題目
每天一道leetcode64-最小路徑和 分類:數組+動態規劃(今天的題目涉及到了動態規劃,直接在數組中選了一道題,難度還是有一些的,這裡說一聲抱歉) 中文鏈接: https://leetcode-cn.com/problems/minimum-path-sum/ 英文鏈接 https://leetcode.com/problems/minimum-path-sum/
題目詳述
給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。 說明:每次只能向下或者向右移動一步。 示例: 輸入: [ [1,3,1], [1,5,1], [4,2,1] ] 輸出: 7 解釋: 因為路徑 1→3→1→1→1 的總和最小。
題目詳解
思路
- 對於矩陣中的任意一個位置,都可以通過這個位置的上一個位置或者左邊的這一個位置移動一步 來到達這個位置(因為每次只能向下或者向右移動一步。);
- 對於矩陣中的任意一個位置(除去邊界位置),dp(i,j) = min(dp(i-1,j),dp(i,j-1)) + grid(i,j)得到,dp(i-1,j)就是(i,j)左邊的這一個點,dp(i,j-1)就是(i,j)的上一個點,比較這兩個數的大小,取最小的加上grid(i,j)就是(i,j)這個位置的最小值
- 邊界情況單獨考慮,對於第一行和第一列,第一行只能是由左邊的一個位置移動得來,第一列只能由它上面的位置移動得到(因為每次只能向下或者向右移動一步。);
代碼
class Solution { public int minPathSum(int[][] grid) { int rows = grid.length; int cols = 0; if(rows != 0) cols = grid[0].length; int [][] equation = new int[rows][cols]; for(int i=0;i<rows;i++) { for(int j=0;j<cols;j++) { if(i == 0 && j ==0) { equation[i][j] = grid[0][0]; }else if(i == 0) { equation[i][j] = equation[i][j-1] + grid[i][j]; }else if(j == 0) { equation[i][j] = equation[i-1][j] + grid[i][j]; }else{ if(equation[i][j-1] < equation[i-1][j]) equation[i][j] = equation[i][j-1] + grid[i][j]; else equation[i][j] = equation[i-1][j] + grid[i][j]; } } } return equation[rows-1][cols-1]; } }
代碼講解
- 3-7行 就是新建一個二維數組大小和grid一樣,這個數組的每一個位置(i,j)用來記錄到達grid(i,j)這裡的路徑和的最小值
- 8-10行 兩次循環,用來遍歷整個數組grid的;
- 12-14行 就是矩陣的左上角就是自己本身了~
- 15-17行 就是矩陣的第一行,就是用(i-1,j)位置的數加上grid(i,j)的值,得到(i,j)的位置的最小距離
- 18-20行 就是矩陣的第一列,只能由上一個位置到達(i,j)
- 21-25行 就是dp(i,j) = min(dp(i-1,j),dp(i,j-1)) + grid(i,j)這個狀態方程的實現 上面思路已經說過