64. 最小路径和
给定一个包含非负整数的 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
解题思路
动态规划
学习思路:看了这个视频就不会觉得动态规划难学了,最小路径和,Leetcode64,讲师版
-
初始化dp表
-
算出横纵坐标的最小路径和
-
横坐标
-
纵坐标
-
-
算出剩余空格内的路径和
-
比较路径和最短
- 若 绿色路径和+grid当前路径最小
- 橙色区域为计算值
- 若 红色路径和+grid当前路径最小
- 橙色区域为计算值
- 若 绿色路径和+grid当前路径最小
-
依次遍历内部剩余部分
-
-
最后取
dp[rowLength-1] [colLength-1]
即为最小路径
代码实现
var minPathSum = function(grid) {
let rowLength=grid.length;
let colLength=grid[0].length;
let dp=new Array(colLength);
for(let index=0;index<rowLength;index++){
dp[index]=new Array(colLength);
}
dp[0][0]=grid[0][0];
for(let index=1;index<colLength;index++){
dp[0][index]=dp[0][index-1]+grid[0][index];
}
for(let index=1;index<rowLength;index++){
dp[index][0]=dp[index-1][0]+grid[index][0];
}
for(let row=1;row<rowLength;row++){
for(let col=1;col<colLength;col++){
dp[row][col]=Math.min(dp[row-1][col],dp[row][col-1])+grid[row][col];
}
}
return dp[rowLength-1][colLength-1];
};