LeetCode 64. 最小路徑和 做題小結
阿新 • • 發佈:2021-01-19
技術標籤:Leetcode# 動態規劃動態規劃演算法leetcode資料結構
題目
給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。
說明:每次只能向下或者向右移動一步。
示例 1:
輸入:grid = [[1,3,1],[1,5,1],[4,2,1]]
輸出:7
解釋:因為路徑 1→3→1→1→1 的總和最小。
示例 2:
輸入:grid = [[1,2,3],[4,5,6]]
輸出:12
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 200
0 <= grid[i][j] <= 100
解題思路與演算法
動態規劃:
- 確定遞推表示式:確定遞推方程及其下標含義,dp[i][j]表示到第i行第j列的最短路徑長度 ,dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+grid[i][j];
- dp陣列的初始化:對左上角元素初始化:dp[0][0]=grid[0][0];對第一列初始化:dp[i][0]=dp[i-1][0]+grid[i][0]; 對第一行初始化:dp[0][i]=dp[0][i-1]+grid[0][i];
- 由遞推表示式得,順序從左向右一層一層遍歷
程式碼
class Solution { public int minPathSum(int[][] grid) { int m=grid.length; int n=grid[0].length; int [][] dp=new int[m][n]; dp[0][0]=grid[0][0]; for(int i=1;i<m;i++) { dp[i][0]=dp[i-1][0]+grid[i][0]; } for(int i=1;i<n;i++) { dp[0][i]=dp[0][i-1]+grid[0][i]; } for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { dp[i][j]=Math.min(dp[i-1][j], dp[i][j-1])+grid[i][j]; } } return dp[m-1][n-1]; } }