leetcode120--三角形最小路径之和

题目:

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

例如,给定三角形:

[

     [2],

    [3,4],

   [6,5,7],

  [4,1,8,3]

]

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

说明:

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

 

实现思路:

第i层,第j个位置,到下一层i+1层的最短距离记为r[i][j],则r[i][j] = triangle[i][j]+min{r[i+1][j],r[i+1][j+1]}
则 res = r[0][0] = triangle[0][0]+min{r[1][0],r[1][1]}
r[1][0] = triangle[1][0]+min{r[2][0],r[2][1]}
r[1][1] = triangle[1][1]+min{r[2][1],r[2][2]}
.....

我们从最后一层开始, 可以知道最后一层的最短距离就是最后一层的值。
r[length][0] =triangle[length][0]
r[length][1] =triangle[length][1]
...

倒数第二层的值到最后一层的最短距离为:
r[length-1][0] =  triangle[length][0]+min{r[length][0],r[length][1]}
r[length-1][1] =  triangle[length][1]+min{r[length][1],r[length][2]}
...

依次往上,直到计算到第一层。

实现代码:

class leeocode120 {
    public int minimumTotal(List<List<Integer>> triangle) {
        int length = triangle.size();
        Integer[] mins = new Integer[length];
        triangle.get(length-1).toArray(mins);
        for(int i = length-2 ;i >= 0;i--){
            List<Integer> temp = triangle.get(i);
            for(int j = 0; j < temp.size() ;j++){
                mins[j] = temp.get(j)+Math.min(mins[j],mins[j+1]);
            }
        }
        return  mins[0] ;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值