【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;
}
}
【leetcode刷题笔记】Triangle的更多相关文章
- LeetCode刷题笔记和想法(C++)
主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...
- 18.9.10 LeetCode刷题笔记
本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...
- LeetCode刷题笔记 - 12. 整数转罗马数字
学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...
- Leetcode刷题笔记(双指针)
1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...
- 【leetcode刷题笔记】Pascal's Triangle II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...
- LeetCode刷题笔记(1-9)
LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...
- leetcode刷题笔记
(1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...
- leetcode刷题笔记08 字符串转整数 (atoi)
题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...
- LeetCode刷题笔记-回溯法-分割回文串
题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...
随机推荐
- UIViewController新方法的使用(transitionFromViewController:toViewController:duration:options:animations:completion:)
iOS5中,UIViewController新添加了几个方法: - (void)addChildViewController:(UIViewController *)childController N ...
- 解决scrollView中嵌套viewPager的冲突问题
很简单,在外层ScrollView中添加android:fillViewport="true"属性,然后给viewPager添加一个固定高度
- Spring Web Flow 入门demo(三)嵌套流程与业务结合 附源代码
上篇博客我们说Spring web Flow与业务结合的方式主要有三种,以下我们主要介绍一下第三种的应用方式 3,运行到<action-state> 元素 SpringWeb Flow 中 ...
- 【ExtAspNet学习笔记】ExtAspNet控件库中常见问题
1.在Grid控件中添加CheckBoxField控件,选择一行时,如何获取选择的CheckBoxField所对应记录的唯一标识值? ●解决方案: 在前台Grid控件中, 添加“<ext:Che ...
- C语言学习笔记(七)——其它运算符
第七章 其它运算符 逗号运算符 逗号运算符:即顺序点,逗号前先运行.后再运行. for循环的运行次数: for(i=n; i<m; + ...
- Linux中终端和控制台区别
Linux中终端和控制台区别: 终端:英文名叫terminal 控制台:英文名叫console 两者区别要从以前的多人使用的计算机开始 以前,由于计算机很昂贵,所用一台计算机一般由多个人同时使用.这样 ...
- Android string.xml 显示特殊符号
项目中要在string.xml 中显示特殊符号,如@号冒号等,直接写肯定不行啦..只能考虑使用ASCII码进行显示: 省略号 …@号 @:号 :空格 以下为常见的ASCII十进制交换编码: --& ...
- 大数进制转换 poj1220
普通的做法,大数除小数. 复杂度o( log(n)*log(n) ),其实就是位数的平方. NUMBER BASE CONVERSION Time Limit: 1000MS Memory Lim ...
- 虚拟化构建二分图(BZOJ2080 题解+浅谈几道双栈排序思想的题)
虚拟化构建二分图 ------BZOJ2080 题解+浅谈几道双栈排序思想的题 本题的题解在最下面↓↓↓ 不得不说,第一次接触类似于双栈排序的这种题,是在BZOJ的五月月赛上. [BZOJ4881][ ...
- RedisTemplate访问Redis数据结构(介绍和常用命令)
Redis 数据结构简介 Redis 可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集 ...