leetcode 算法-三角形最小路径和-120

leetcode 算法-三角形最小路径和

leetcode 传送门

题目

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]

自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

说明:

如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

解题思路

本题是一道动态规划的典型应用题。
首先我们可以得出这样一个关系,设triangle为三角形的矩阵,min为最小路径,i为行索引,j为列索引,min(i,j)为从第i行,第j列到底部的最小路径和,则:min(i,j)=triangle[i][j]+min(i+1,j)+min(i+1,j+1)。

有了这个式子之后,我们还需要一个二维数组来保存min,但是又不能创建新数组,然后我们可以发现triangle正好可以用来保存min,我们需要从底到上遍历,triangle[i][j]用来保存min[i][j],当遍历至顶端的时候,结果也自然计算出来了。

这种方法空间复杂度只有常数级别,只适用了固定的额外空间,速度不是很快,但是也不慢。

代码

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if (triangle == null || triangle.size() == 0){
            return 0;
        }
        int len = triangle.size();
        List<Integer> cur, last = triangle.get(len - 1);
        for (int i = len - 2; i >= 0; i--) {
            cur = triangle.get(i);
            for (int lenI = cur.size(), j = 0, left = last.get(0); j < lenI; j++) {
                cur.set(j, cur.get(j) + Math.min(left, left = last.get(j + 1)));
            }
            last = cur;
        }
        return triangle.get(0).get(0);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值