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.


题目标签:Array, Dynamic Programming

  题目给了我们一个三角的array list, 让我们从中找到最小值的路线。一旦看到这种每一个点可以选择路线的,有不同可能性的,大多都是 DP 问题。一开始自己写了一个 复制一个 三角的array list, 然后从上到下的遍历,把每一个种可能都存到新的三角 array list。但是用了过多的 extra space, 没有满足它的要求。 所以通过后发现速度太慢,想了一会就放弃了,去网上找答案。有时候如果认认真真自己想一道这样类似的题目,可能会用3,4个小时的时间,而且,还不一定想的出正确答案,所以通常花费1个多小时的话,就果断去找答案了。

  只用O(n) 空间的方法:

    设立一个 n+1 array,然后从最下面一行倒着遍历回第一行,对于n+1 array里面的数字,取它和它后面 两者之中 小的那一个数字,加上 在三角里相对应位置的数字, 存入n+1 array。 基本思想是,利用倒着遍历的方法,可以把每一个数字的最优选择path 存入n+1 array里,当遍历回第一行的时候,因为只有一个数字,那么取得的path 一定是最优的那一个,换句话说,就是minimum path sum。

举例: 1 5 3 2 为最优路线

          

            

       

4             8                  对于每一个数字,选下面相邻2个中小的那一个 +  自己   一直遍历回第一行

0       0      0       0      0        设立的1d array 相当于在这个位置

设立n + 1 array: 从三角最下面遍历回最上面, 每次在1d array 里 取相邻两个种小的那一个 +  三角里对应位置的数字

0  0  0  0  0  初始为0,为什么要多一个呢,因为每次都是取当前和后面一个数字比较,所以当遍历到第四个的时候,需要和第五个比较

遍历三角开始, 结合上面三角图形来看

 4    1    8    3    0  遍历三角4183 -> 因为1d array里都是0,所以每次取相邻里小的那一个的话,都是0 + 三角里对应位置的数字,相当于 把最后一行复制一下

 7    6   10   3    0  遍历三角657   -> 从之前存的里面,挑对应相邻两个中小的那个 + 自己 存入1d array

 9   10  10   3    0  遍历三角34

11  10  10   3    0  遍历三角2 -> 得到答案11

Java Solution:

Runtime beats 58.69%

完成日期:08/27/2017

关键词:Array, Dynamic Programming

关键点:从下向上遍历,把最优路线存入1d array

 class Solution
{
public int minimumTotal(List<List<Integer>> triangle)
{
// create a k+1 size array
int [] arr = new int[triangle.size() + 1]; // iterate from last row to first row
for(int i=triangle.size()-1; i>=0; i--)
{
// iterate each row from left to right
for(int j=0; j<triangle.get(i).size(); j++)
{
arr[j] = Math.min(arr[j], arr[j+1]) + triangle.get(i).get(j);
}
} /* the answer is the first number because we start from last row back to first row
and first row is just one number */
return arr[0];
}
}

参考资料:

https://discuss.leetcode.com/topic/22254/7-lines-neat-java-solution

LeetCode 算法题目列表 - LeetCode Algorithms Questions List

LeetCode 120. Triangle (三角形)的更多相关文章

  1. LeetCode 120. Triangle三角形最小路径和 (C++)

    题目: Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjace ...

  2. LeetCode 120. Triangle (三角形最小路径和)详解

    题目详情 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径 ...

  3. 120 Triangle 三角形最小路径和

    给出一个三角形(数据数组),找出从上往下的最小路径和.每一步只能移动到下一行中的相邻结点上.比如,给你如下三角形:[     [2],    [3,4],   [6,5,7],  [4,1,8,3]] ...

  4. LeetCode - 120. Triangle

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  5. [算法]LeetCode 120:三角形最小路径和

    题目描述: 给定一个三角形,找出自顶向下的最小路径和.每一步只能移动到下一行中相邻的结点上. 例如,给定三角形: [ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和 ...

  6. [leetcode]120.Triangle三角矩阵从顶到底的最小路径和

    Given a triangle, find the minimum path sum from top to bottom.Each step you may move to adjacent nu ...

  7. leetcode 120 Triangle ----- java

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  8. [LeetCode] 120. Triangle _Medium tag: Dynamic Programming

    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent n ...

  9. [leetcode 120]triangle 空间O(n)算法

    1 题目 Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjac ...

随机推荐

  1. WPF(C#) 矩阵拖动、矩阵动画、边缘展开动画处理。

    最近在研发新的项目,遇到了一个桌面模式下的难点--展开动画.之前动画这方面没做过,也许很多人开始做的时候也会遇到相关问题,因此我把几个重点及实际效果图总结展示出来: 我的开发环境是在VS2017下进行 ...

  2. 06jQuery-04-DOM操作

    jQuery既然是为了帮助你能从js的繁琐中解脱出来,自然在DOM操作上也有自己的一套. 1.修改Text和HTML 之前我们提到过,如果用JS的话,你要修改Text或者HTML需要用到其innerH ...

  3. 自动化测试之 seleniumIDE,Selenium1,selenium2和testNG入门

    由于前期三个月公司的项目一直在改需求阶段,一直是手动测试,现在项目雏形以及基本页面功能都确定下来,为了不让自己陷入天天测同一功能的无限循环中,故开始自动化测试的学习之路,也为自己以后的发展铺铺路. 一 ...

  4. Promise小书(长文)

    promise基础 Promise是异步编程的一种解决方案.ES6 Promise的规范来源于Promises/A+社区,它有很多版本的实现. Promise比传统的解决方案(回调函数和事件)更合理和 ...

  5. SpringMVC Restful api接口实现

    [前言] 面向资源的 Restful 风格的 api 接口本着简洁,资源,便于扩展,便于理解等等各项优势,在如今的系统服务中越来越受欢迎. .net平台有WebAPi项目是专门用来实现Restful ...

  6. 学习率 Learning Rate

    本文从梯度学习算法的角度中看学习率对于学习算法性能的影响,以及介绍如何调整学习率的一般经验和技巧. 在机器学习中,监督式学习(Supervised Learning)通过定义一个模型,并根据训练集上的 ...

  7. Java IO使用入门

    总体结构 IO应该是平时项目里最常用到的功能了,无论是简单的文件读取,还是服务器端口监听,都会用到IO:但是,在面对Java IO包里庞杂的IO基础类库时,经常会很头大,是该选择InputStream ...

  8. 新书发布《每天5分钟玩转Docker容器技术》

    后台不时收到关于纸质版教程书籍的询问,今天终于可以给大家一个交代了. <每天5分钟玩转Docker容器技术>现已在各大书城上架. 比较了一下,目前京东上最实惠:https://item.j ...

  9. IDEA用maven创建springMVC项目和配置

    工具准备:IDEA2016.3 Java jdk 1.8 1.DEA创建项目 新建一个maven project,并且选择webapp原型.  然后点击next  这里的GroupId和Artifac ...

  10. 01.python基础知识_01

    一.编译型语言和解释型语言的区别是什么? 1.编译型语言将源程序全部编译成机器码,并把结果保存为二进制文件.运行时,直接使用编译好的文件即可 2.解释型语言只在执行程序时,才一条一条的解释成机器语言给 ...