1.题目
给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。
示例:
输入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-path-sum
2.想法
将数组每个位置的最小路径和都求解出来,继而算出整个的最小路径。可以选择另开辟数组保存所有值,也可以将原数组进行覆盖,因为只要计算过的后面便不在用到。
类似与62,也可以压缩成一维数组。
3.自己题解
class Solution {
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
int result[][]=new int[m][n];
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(i==0&&j==0){result[i][j]=grid[0][0];}
else if(i==0){
result[i][j]=grid[i][j]+result[i][j-1];
}
else if(j==0){
result[i][j]=grid[i][j]+result[i-1][j];
}
else{
result[i][j]=grid[i][j]+(Math.min(result[i-1][j],result[i][j-1]));
}
}
}
return result[m-1][n-1];
}
}
优化空间题解
class Solution {
public int minPathSum(int[][] grid) {
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(i == 0 && j == 0) continue;
else if(i == 0) grid[i][j] = grid[i][j - 1] + grid[i][j];
else if(j == 0) grid[i][j] = grid[i - 1][j] + grid[i][j];
else grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}
一维数组题解
class Solution{
public int minPathSum(int[][] grid) {
int m=grid.length;
int n=grid[0].length;
int dp[]=new int[n];
dp[0]=grid[0][0];
for(int i=1;i<n;i++) dp[i]=dp[i-1]+grid[0][i];
for(int i=1;i<m;i++){
for(int j=0;j<n;j++){
if(j==0) dp[j]+=grid[i][0];
else dp[j]=Math.min(dp[j],dp[j-1])+grid[i][j];
}
}
return dp[n-1];
}
}
4.效率
(1)另开数组
(2)优化空间
运行结果好像看不出什么区别
(3)一维数组