Leetcode 64.最小路径和
问题描述
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入: [ [1,3,1], [1,5,1], [4,2,1] ] 输出: 7 解释: 因为路径 1→3→1→1→1 的总和最小。
思路
动态规划
和62、63题思路类似。只要稍加改变数路径的函数。dp[i]表示当前位置到终点的最路径和
dp[i]=当前数字grid[i][j]+min(右侧和下侧最短路径和)
初始化时注意边界之外的格子到终点的距离是无穷大的。
class Solution {
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
return uniquePaths(m,n,grid);
}
public int uniquePaths(int m, int n,int[][] grid) {
int[] dp=new int[n+1];
for (int i = 0; i <= n; i++) {
//dp[i]初值表示格子最下排之外的位置。无法到达终点,设为无穷大。
dp[i]=Integer.MAX_VALUE;
}
dp[n-1]=0;//终点正下方到终点距离设为0
for (int i=m-1;i>=0;i--){
for (int j=n-1;j>=0;j--){
dp[j]=grid[i][j]+Math.min(dp[j],dp[j+1]);
}
}
return dp[0];
}
}
执行结果:
通过
执行用时 :3 ms, 在所有 Java 提交中击败了98.16%的用户