120. Triangle (DP)

40 篇文章 0 订阅
7 篇文章 0 订阅

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

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

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

分析:

典型的DP问题~但是还是做不到独立解决!已经可以推导出递推公式了,但是问题是我想new一个和triangle同样大小的List,然后保存每个位置的最小结果,从后往前递归可以求出结果,但是我傻,没想到怎么初始化,其实可以直接List<List<Integer>> copy  = new ArrayList<ArrayList<Integer>>(triangle)!但是这种方法会浪费空间。

从前往后看就是找到下一层左右两个元素中较小的那个加上该元素,但是如果这样的话需要便利多次,那么从后往前,用一个数组保存下一层求和结果,然后找到左右两个中小的那个,加上当前元素。当前index=i的元素对应下一层左右就是i, i+1.

实际上,直接new一个数组或者List, 大小等于最后一层的大小(最大)就可以了,因为从后往前找最小值的时候只会用到下一层的结果~~这里我们可以发现最后一层的大小等于层数,但是我第一遍的时候int[] layer = new int[triangle.size()]会报错OOI~~为什么呢?因为最后一层更新的时候Math,min(layer[j], layer[j+1]),会访问j+1个元素,所以我们int[] layer = new int[triangle.size()+1]就好啦!!

 public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle == null)
            return 0;
        int[] layer = new int[triangle.size()+1];//注意这里大小
        for(int i=triangle.size()-1;i>=0;i--){
            for(int j=0;j<triangle.get(i).size();j++){
                layer[j] = Math.min(layer[j],layer[j+1]) + triangle.get(i).get(j);//注意求最小值是在新建数组中,新建的数组保存的是下一层左右两个元素的结果
            }
        }
        return layer[0];
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值