leetcode 64.最小路径和

原题

64.最小路径和
在这里插入图片描述

题解

方法一

动态规划。
此方法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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可爱抱抱呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值