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的更多相关文章

  1. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  2. 18.9.10 LeetCode刷题笔记

    本人算法还是比较菜的,因此大部分在刷基础题,高手勿喷 选择Python进行刷题,因为坑少,所以不太想用CPP: 1.买股票的最佳时期2 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. ...

  3. LeetCode刷题笔记 - 12. 整数转罗马数字

    学好算法很重要,然后要学好算法,大量的练习是必不可少的,LeetCode是我经常去的一个刷题网站,上面的题目非常详细,各个标签的题目都有,可以整体练习,本公众号后续会带大家做一做上面的算法题. 官方链 ...

  4. Leetcode刷题笔记(双指针)

    1.何为双指针 双指针主要用来遍历数组,两个指针指向不同的元素,从而协同完成任务.我们也可以类比这个概念,推广到多个数组的多个指针. 若两个指针指向同一数组,遍历方向相同且不会相交,可以称之为滑动窗口 ...

  5. 【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, ...

  6. LeetCode刷题笔记(1-9)

    LeetCode1-9 本文更多是作为一个习题笔记,没有太多讲解 1.两数之和 题目请点击链接 ↑ 最先想到暴力解法,直接双循环,但是这样复杂度为n平方 public int[] twoSum(int ...

  7. leetcode刷题笔记

    (1)Best Time to Buy and Sell Stock Total Accepted: 10430 Total Submissions: 33800My Submissions Say ...

  8. leetcode刷题笔记08 字符串转整数 (atoi)

    题目描述 实现 atoi,将字符串转为整数. 在找到第一个非空字符之前,需要移除掉字符串中的空格字符.如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即 ...

  9. LeetCode刷题笔记-回溯法-分割回文串

    题目描述: 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab"输出:[ ["aa", ...

随机推荐

  1. 【SpringMVC学习06】SpringMVC中的数据校验

    这一篇博文主要总结一下springmvc中对数据的校验.在实际中,通常使用较多是前端的校验,比如页面中js校验,对于安全要求较高的建议在服务端也要进行校验.服务端校验可以是在控制层conroller, ...

  2. 全球IT管理最佳实践之DevOps Master 认证

    原文:http://soft.chinabyte.com/30/13940030.shtml 作者:国际最佳实践管理联盟 孙振鹏 关键字: DevOps.DevOps认证.DevOpsDays.Dev ...

  3. 中小企业 DevOps 从 0 到 1

    原文:http://www.sohu.com/a/145065274_262549 今天主要有四个课题: 先聊一聊 DevOps: 然后跟大家聊一聊运维知识的体系和职业发展: 再是中小企业基于开源的 ...

  4. Codeforces Round #275 (Div. 2) C

    题目传送门:http://codeforces.com/contest/483/problem/C 题意分析:题目意思没啥好说的. 去搞排列列举必须TLE.那么就想到构造. 1.n.2.n-1.3.n ...

  5. Winform 动态 画图 不闪

    一.问题:解决winform动态画图闪的问题,网上搜的方法,大部分都是: “this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlSty ...

  6. find - exec 命令

    find是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释: -exec  参数后面跟的是command ...

  7. 系统服务-----NotificationManager

    熟悉api事例笔记: package com.test; import com.example.test.R; import android.app.Activity; import android. ...

  8. FILE 创建

    public class CreateDelFileUtils implements Serializable{ /** * */ private static final long serialVe ...

  9. PHP性能之语言性能优化:魔术方法好不好?

    魔术方法是什么鬼? 魔术方法,也叫魔鬼函数.只要学过PHP的都知道什么是魔术方法,魔术方法就是在某些条件下自动执行的函数. PHP的魔术方法主要有下面几个,其他的参考PHP官方手册 __constru ...

  10. ubuntu 16.04中卸载软件。

    今天装了个QQ,结果不会用,折腾了半天终于卸载掉了. dpkg -l | grep qq(查出安装的软件) 使用 sudo dpkg --purge xxx(这里xxx写查出来的软件包名字)