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).

Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.


题解:典型的动态规划,开始的想法是用一个二维数组sum,sum[i][j]表示从第一行第一列走到(i,j)所得的最小和。那么sum[i,j] = triangle[i,j] + sum[i-1,j-1](注意下表越界判断)。最后返回sum最后一行中最小的元素。

代码如下:

 public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle == null || triangle.size() == 0)
return 0; int length = triangle.size();
int[][] sum = new int[length][length]; for(int i = 0;i < triangle.get(0).size();i++)
sum[0][i]= triangle.get(0).get(i); for(int i = 1;i < length;i++){
for(int j = 0;j < triangle.get(i).size();j++){
int left = j-1>=0?sum[i-1][j-1]:Integer.MAX_VALUE;
int middle = j>triangle.get(i).size()-2?Integer.MAX_VALUE:sum[i-1][j]; sum[i][j] = triangle.get(i).get(j) + Math.min(left, middle);
}
} int answer = Integer.MAX_VALUE;
for(int i = 0;i < triangle.get(length-1).size();i++)
answer = Math.min(answer, sum[length-1][i]); return answer;
}
}

上述的解法是O(n2)的空间复杂度,实际上在计算当前行sum的时候我们只用到了上一行的sum值,所以我们可以只保存上一行元素的sum值。但是有一点要注意,如果直接把sum降维成一维数组并且按照从左往右的顺序计算sum是不正确的。例如如下的例子

[
[-1],
[-2,-3],
]

在计算第二行的时候,sum=[-1,0],当计算到元素-2所对应的sum时,sum被更新为[-3,0],那么在计算-3所对应的sum的时候需要的上一行元素对应的-1就丢失了,会得到-3对应的sum为-6的错误结果。所以我们在计算当前行元素的时候,要从后往前计算,就不会把计算下一个元素要用到的数据弄丢了。

最后空间复杂度为O(n)的代码如下:

 public class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
if(triangle == null || triangle.size() == 0)
return 0; int length = triangle.size();
int[] sum = new int[length]; for(int i = 0;i < triangle.get(0).size();i++)
sum[i]= triangle.get(0).get(i); for(int i = 1;i < length;i++){
for(int j = triangle.get(i).size()-1;j>=0;j--){
int left = j-1>=0?sum[j-1]:Integer.MAX_VALUE;
int middle = j>triangle.get(i).size()-2?Integer.MAX_VALUE:sum[j]; sum[j] = triangle.get(i).get(j) + Math.min(left, middle);
}
} int answer = Integer.MAX_VALUE;
for(int i = 0;i < triangle.get(length-1).size();i++)
answer = Math.min(answer, sum[i]); return answer;
}
}

最新文章

  1. Spire.Pdf 的各种操作总结
  2. php返回json,xml,JSONP等格式的数据
  3. 乌龟棋(noip2010)
  4. 你自认为理解了JavaScript?
  5. 阿里云Centos7使用yum安装MySQL5.6的正确姿势
  6. 在android移动设备上登录gmail的时候报password错误解决方法!!!!
  7. Struts2之Result详解
  8. 设计模式的征途—1.单例(Singleton)模式
  9. 用php+mysql+ajax实现淘宝客服或阿里旺旺聊天功能 之 后台页面
  10. 关于python如果没有numpy模块如何处理
  11. 大数据BI框架知识点备注
  12. android 版本更新适配8.0,解决8.0手机无法更新自动安装apk
  13. VCenter6.0.0的安装过程
  14. 二分法binadySearch的用法
  15. javascript:控制台详解
  16. input的焦点事件
  17. C# 分析 IIS 日志(Log)
  18. Unique Binary Search Trees II leetcode java
  19. 〖Linux〗干掉Kubuntu烦人的软件升级提示“Update notification daemon”,Your should update ..
  20. python json (loads(),load(),jump(),jumps())

热门文章

  1. Gradle学习小结
  2. 关于清理 mac 其他文件的的方法
  3. IBM Security App Scan 资料整理
  4. 1045. Favorite Color Stripe (30) -LCS同意元素反复
  5. 借助Anyproxy实时监控接口调用次数和流量
  6. lua math 库
  7. [WebGL入门]二十五,点光源的光照
  8. bootstrat 设置 select option 选项的值
  9. FreeSWITCH 基础
  10. linux用一键安装包 禅道