LeetCode - Triangle

来源:互联网 发布:python multiply与 编辑:程序博客网 时间:2024/05/16 23:05

https://leetcode.com/problems/triangle/

这道题就是用一个sum数组,每层扫描,保存到每层的每个node的min_pathsum

对于每层而言,

这道题可以用递归做,只是用递归会有很多重复计算,所以此处用DP做,只用一个一维数组来保存每层的最小和值,然后每层更新。

而且用递归不符合空间O(n)的要求(n为层数),因为每个node都要递归一遍,所以需要保存O(nodenumber)次,空间复杂度为O(nodenumber)

当j=0时,最小值就是上一层的sum[0]+本身的值

当j是本层最右边的值时,最小值就是sum[j-1]+本身的值

当j在中间时,最小值就是Math.min(sum[j],sum[j-1])+本身的值


可以看到,在算每个数的时候,需要用到上一层在这个数左边的值,即算sum[j]需要用到上一层的sum[j-1],所以应该先更新sum[j],再更新sum[j-1]

代码如下,如提示要求的,空间复杂度 O(n), n是三角形的层数,

    public int minimumTotal(List<List<Integer>> triangle) {        int n=triangle.size();        int[] sum = new int[n];        for(int i=0; i<n; i++){            List<Integer> tmp = triangle.get(i); //本行只产生一个list的reference,不生成新的list,所以空间消耗只是reference的大小            for(int j=tmp.size()-1; j>=0; j--){                if(i==0 && j==0) sum[j] = tmp.get(0);                else if(j==tmp.size()-1) sum[j] = sum[j-1]+tmp.get(j);                else if(j==0) sum[j] = sum[j]+tmp.get(0);                else sum[j] = Math.min(sum[j-1],sum[j])+tmp.get(j);            }        }        int rst = Integer.MAX_VALUE;        for(int i=0; i<n; i++){            if(sum[i]<rst) rst = sum[i];        }        return rst;    }


0 0
原创粉丝点击