leetcode算法题,给出一个三角形,计算从三角形顶部到底部的最小路径和

leetcode算法题,给出一个三角形,计算从三角形顶部到底部的最小路径和

题目:
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[↵ [2],↵ [3,4],↵ [6,5,7],↵ [4,1,8,3]↵]
最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。
注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。

思考:

1.有两种方式,一种是从上到下暴力解题,另一种是从下到上暴力解题
2.第一种方式的问题是,如何保存当前层到下一层各个节点最短的路径值,可以新增一个数组来存储,但是由于获得下一层结点的最短路径时,当前数组的各个值会用到两次,那么就不可能在计算下一层的最短结点的时候逐个覆盖当前数组的值,势必需要再增加一个数组,来交替存储最新的最短路径值。但这样不满足O(n)的空间复杂度。那么这种从上到下的解题方式是不是就不行呢,答案是不是,可以用这个三角形数组每一层本身来存储到达当前层的最短路径,这样不需要额外的存储空间。
3第二种方式,需要用到额外的一个数组,temp[n],O(n)的空间复杂度。当计算到达上一层的最短路径并覆盖存储到temp[n]数组时,覆盖的那个节点已经不需要再次使用了,所以不需要再新增一个数组。

第二种方式实现代码

import java.util.*;
public class Solution {
    public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
        if (triangle.size()==0||triangle==null)
            return 0;
        //记录三角形的层数
        int n=triangle.size();
        //创建一个暂存数组,用于存放到达每一层各个节点的最小步数
        int[] temp=new int[n];
        //从最后一层到第一层的最短距离和从第一层到最后一层的最短距离是一样的,采用从最后一层到第一层可以方便运算
        //先初始化temp数组,暂存最后一层的结点
        for (int i=0; i<n; i++)
            temp[i]=triangle.get(n-1).get(i);
        //然后向上运算,到达上一层的最小值,应该是当前层的结点,也就是暂存数组的元素两两比较的最小值和上一层结点的相加
        for(int i=n-2; i>=0; i--){
            for(int j=0; j<=i; j++){
                temp[j]=triangle.get(i).get(j)+Math.min(temp[j],temp[j+1]);
            }
        }
        return temp[0];
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

豆得儿不是猫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值