leetcode最小路径和

本文介绍了解决LeetCode中最小路径和问题的一种高效算法,通过动态规划思想,找到从左上角到右下角路径上的数字总和最小值。文章详细解析了算法原理,包括如何设置和更新代价矩阵,以及边界条件的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

leetcode最小路径和(动态规划)

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。 输入: [[1,3,1], [1,5,1], [4,2,1]] 输出: 7 解释: 因为路径
1→3→1→1→1 的总和最小。 来源:力扣(LeetCode)

题目链接

该题采用动态规划思想,类似于矩阵链

求左上角到右下角经过路径加和最小值min,则设置代价矩阵mim:

mim [i] [j] = min(mim [i] [j-1] , mim [i-1] [j]) + grid [i] [j]

然后处理下边界情况,即可构造出最优解,我的解采用的是从目标节点向起始节点反向计算。

// 优化

查看排名靠前的解,代价矩阵可以不设,因为只使用一次,无需备忘录,直接将grid值覆盖即可!

然后简化计算,首先直接得出边界值,再计算其他值,速度也会有小提升。

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length,n = grid[0].length;
        int[][] mim= new int[m][n];
        mim[m-1][n-1] = grid[m-1][n-1];
        for (int i = m-1 ; i >= 0 ; i--) {
            for (int j = n-1; j >= 0; j--) {
                if(j==n-1 && i==m-1)continue;
                if( j==n-1 ){
                    mim[i][j] = mim[i+1][j] + grid[i][j];
                }else if(i == m-1){
                    mim[i][j] = mim[i][j+1] + grid[i][j];
                }else{
                    mim[i][j] = mim[i][j+1]<mim[i+1][j]?mim[i][j+1]+grid[i][j]:mim[i+1][j]+grid[i][j];
                }
                //System.out.println(mim[i][j]);
            }
        }
        return mim[0][0];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值