原题
题解
方法一
动态规划。
此方法java代码示例:
/*
@v7fgg
执行用时:3 ms, 在所有 Java 提交中击败了89.20%的用户
内存消耗:42.8 MB, 在所有 Java 提交中击败了24.24%的用户
2020年7月7日 20:37
*/
class Solution {
public int minPathSum(int[][] grid) {
int ans[][]=new int[grid.length][grid[0].length];
ans[0][0]=grid[0][0];
for(int i=0;i<grid.length;i++){
for(int j=0;j<grid[0].length;j++){
if(i==0||j==0){
if(i==0&&j>0){
ans[i][j]=ans[i][j-1]+grid[i][j];
}
else if(i>0&&j==0){
ans[i][j]=ans[i-1][j]+grid[i][j];
}
}
else{
ans[i][j]=Math.min(ans[i-1][j],ans[i][j-1])+grid[i][j];
}
}
}
return ans[grid.length-1][grid[0].length-1];
}
}
空间优化为一维:
/*
@v7fgg
执行用时:3 ms, 在所有 Java 提交中击败了89.20%的用户
内存消耗:42.4 MB, 在所有 Java 提交中击败了30.30%的用户
2020年7月7日 22:26
*/
class Solution {
public int minPathSum(int[][] grid) {
int ans[]=new int[grid.length];
for(int j=0;j<grid[0].length;j++){
for(int i=0;i<grid.length;i++){
if(i==0&&j==0){ans[0]=grid[0][0];}
else if(j==0){ans[i]=ans[i-1]+grid[i][0];}
else if(i==0){ans[0]+=grid[0][j];}
else{ans[i]=Math.min(ans[i-1],ans[i])+grid[i][j];}
}
}
return ans[grid.length-1];
}
}
空间j进一步优化,在原地直接修改:
/*
@v7fgg
执行用时:4 ms, 在所有 Java 提交中击败了30.85%的用户
内存消耗:42.9 MB, 在所有 Java 提交中击败了22.72%的用户
2020年7月7日 20:54
*/
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){
if(j>0&&i==0){
grid[i][j]+=grid[i][j-1];
}
else if(j==0&&i>0){
grid[i][j]+=grid[i-1][j];
}
continue;
}
grid[i][j]+=Math.min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[grid.length-1][grid[0].length-1];
}
}
方法二 暴力
回溯法超时。
//60 / 61 个通过测试用例 状态:超出时间限制
//2020.07.07 21:24
class Solution {
int ans=Integer.MAX_VALUE;;
public int minPathSum(int[][] grid) {
luxian(grid,0,0,0);
return ans;
}
public void luxian(int[][] grid,int x,int y,int sum){
if(sum>=ans){return;}
if(x==grid.length||y==grid[0].length){
if(x==grid.length&&y==grid[0].length-1||x==grid.length-1&&y==grid[0].length){
ans=Math.min(ans,sum);
}
return;
}
sum+=grid[x][y];
luxian(grid,x+1,y,sum);
luxian(grid,x,y+1,sum);
sum-=grid[x][y];
}
}
优化后依旧超时:
//60 / 61 个通过测试用例 状态:超出时间限制
//2020.07.07 21:36
class Solution {
int ans=Integer.MAX_VALUE;;
public int minPathSum(int[][] grid) {
luxian(grid,0,0,0);
return ans;
}
public void luxian(int[][] grid,int x,int y,int sum){
if(sum>=ans){return;}
sum+=grid[x][y];
if(x==grid.length-1&&y==grid[0].length-1){
ans=Math.min(ans,sum);
return;
}
else if(x==grid.length-1){
luxian(grid,x,y+1,sum);
}
else if(y==grid[0].length-1){
luxian(grid,x+1,y,sum);
}
else{
luxian(grid,x+1,y,sum);
luxian(grid,x,y+1,sum);
}
sum-=grid[x][y];
}
}