LeetCode 120. 三角形最小路径和 动态规划

今天带来一题经典动态规划问题,LeetCode的120题,就是数塔问题。
在这里插入图片描述
本来是想从上面往下做的,初始化左右两边即最上面那个点,然后一直有问题,好吧,那就自底向上写吧。
老生常谈,先用递归来写,毕竟写法方便不废脑子,要是能过了最好。
在这里插入图片描述
但是明显效果不好,答案是对的,但超时,
不过我还是说一下递归吧,首先设置好边界,达到了最后一行的时候,返回所在值是必须的,以及如果x,或y走出去了,那得想办法收回来,怎么办,如果是求最大,返回一个非常小的值, 如果题目都是正数,就返回一个负数,如果求最小,就返回一个很大的值,这样不管如何,函数会自己帮你选择规范的路径。
这题递归的话设置两个边界就行。

但是超时,那就考虑dp。
自底向上,先初始化底部,然后一个一个往上加,每一个点都是最小值,直到累加到了顶点,那就一定是最小值。无后效性,可以求出最优解。
在这里插入图片描述
效率一般般,可以优化,显然,时间已经无法优化了,从空间着手吧,以前讲过可以使用滚动数组,这里我们就化二维变成一维。我们可以想一下,按照上面的说法,每一层求出来的都是最小值了,无后效性!和背包问题不同,我们已经不需要用过的数字了,替换掉就行,这样就不停的更替,更新为新的最小值的一维数组。
效率还不错。
在这里插入图片描述
这是代码。

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int m = triangle.size();
        int[] dp = new int[m + 1];
        for(int i = 0; i < m; i ++) {
            dp[i] = triangle.get(m - 1).get(i);
        }
        for(int i = m - 2; i >= 0; i --) {
            for(int j = 0; j <= i; j ++) {
                dp[j] = Math.min(dp[j], dp[j + 1]) + triangle.get(i).get(j);
            }
        }
        return dp[0];
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值