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
- LeetCode : Triangle
- [LeetCode] Triangle
- [Leetcode] Triangle
- [LeetCode] Triangle
- 【leetcode】Triangle
- LeetCode - Triangle
- [LeetCode]Triangle
- [Leetcode]Triangle
- [leetcode]Triangle
- Leetcode: Triangle
- [LeetCode] Triangle
- LeetCode-Triangle
- [leetcode] Triangle
- [LeetCode] Triangle
- LeetCode - Triangle
- 【Leetcode】Triangle
- LeetCode | Triangle
- [leetcode]Triangle
- 建造模式(Builder)
- 不要自称为程序猿
- xcode_模拟器黑屏
- Android學習進度---小小計算器
- Map的使用
- LeetCode - Triangle
- Processing自学第一课
- linux 操作学习记录
- OpenGL学习-1-GLAUX建窗练习工程代码
- IOS基础控件学习—参考其他博客
- PE 2 Even Fibonacci numbers
- Cocos2dx 场景自动切换
- #iOS# Grand Central Dispatch 后台处理及应用
- JVM内存参数详解以及配置调优