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