前言

 

【LeetCode 题解】系列传送门:  http://www.cnblogs.com/double-win/category/573499.html

 

1.题目描述

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.

 

2. 思路

寻找三角形中,自上而下的路径中,权值和的最小值。

从上面的例子中,不难看出其路径的遍历方式与二叉树类似,区别就在于二叉树中 相邻两个节点的子节点都是独立的,而在三角形中,

节点 A[0] 的子节点为 B[0], B[1] ; 节点A[1]的子节点为 B[1], B[2]。 B[1]被A[0]和A[1]共享。

既然这个题目与二叉树如此类似,那么肯定能用DFS来做了,可是使用DFS必然效率不是很快,那么这道题有没有什么技巧呢?

 

可以看到题目仅仅只是需要将和给出,而并没有要求三角形中的数据不能变,那么我们可以用贪心的方法,自底向上累加,找到最小的值。

以上例中的第3行和第4行为例:
A: [6,5,7],
B: [4,1,8,3]
为了描述方便,不妨设第3行为A, 第4行为B。

由于第3行的每个节点都有左右两个孩子节点, 当进行加和遍历的时候, 如果遍历到A[i] ,那么可以选择的子节点只有 B[i] 和B[i+1]。 那么在节点A[i]处的最小和就应该是 A[i] + min{B[i],B[i+1]}.

对A中各个元素求最小和,

A:   [6,5,7],
{4,1}{1,8},{8,3}
A': [6+1, 5+1, 7+3]
B: [4,1,8,3]

可得到 A'= {7,6,10}

向上递归,可知 triangle的首元素 triangle[0][0],必定为最小和。

 

3. 解法

 1 class Solution {
2 public:
3 int minimumTotal(vector<vector<int> > & triangle)
4 {
5 vector<int> vi;
6 int len = triangle.size();
7 if(1==len) return triangle[0][0];
8
9 int i,j;
10 for(i=len-2;i>=0;--i)
11 {
12 for(j=0;j<triangle[i].size();j++)
13 {
14 triangle[i][j]+= (triangle[i+1][j]<triangle[i+1][j+1]?triangle[i+1][j]:triangle[i+1][j+1]); // 贪心策略
15 }
16 }
17 return triangle[0][0];
18 }
19 };

作者:Double_Win

出处:   http://www.cnblogs.com/double-win/p/3709291.html

声明: 由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正~

[LeetCode 题解]: Triangle的更多相关文章

  1. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷LeetCode题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有 ...

  2. leetcode题解-122买卖股票的最佳时期

    题目 leetcode题解-122.买卖股票的最佳时机:https://www.yanbinghu.com/2019/03/14/30893.html 题目详情 给定一个数组,它的第 i 个元素是一支 ...

  3. 【LeetCode题解】3_无重复字符的最长子串(Longest-Substring-Without-Repeating-Characters)

    目录 描述 解法一:暴力枚举法(Time Limit Exceeded) 思路 Java 实现 Python 实现 复杂度分析 解法二:滑动窗口(双指针) 思路 Java 实现 Python 实现 复 ...

  4. 【LeetCode题解】225_用队列实现栈(Implement-Stack-using-Queues)

    目录 描述 解法一:双队列,入快出慢 思路 入栈(push) 出栈(pop) 查看栈顶元素(peek) 是否为空(empty) Java 实现 Python 实现 解法二:双队列,入慢出快 思路 入栈 ...

  5. 【LeetCode题解】232_用栈实现队列(Implement-Queue-using-Stacks)

    目录 描述 解法一:在一个栈中维持所有元素的出队顺序 思路 入队(push) 出队(pop) 查看队首(peek) 是否为空(empty) Java 实现 Python 实现 解法二:一个栈入,一个栈 ...

  6. 【LeetCode题解】844_比较含退格的字符串(Backspace-String-Compare)

    目录 描述 解法一:字符串比较 思路 Java 实现 Python 实现 复杂度分析 解法二:双指针(推荐) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记可以 ...

  7. 【LeetCode题解】25_k个一组翻转链表(Reverse-Nodes-in-k-Group)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解笔记 ...

  8. 【LeetCode题解】24_两两交换链表中的节点(Swap-Nodes-in-Pairs)

    目录 描述 解法一:迭代 思路 Java 实现 Python 实现 复杂度分析 解法二:递归(不满足空间复杂度要求) 思路 Java 实现 Python 实现 复杂度分析 更多 LeetCode 题解 ...

  9. 【LeetCode题解】347_前K个高频元素(Top-K-Frequent-Elements)

    目录 描述 解法一:排序算法(不满足时间复杂度要求) Java 实现 Python 实现 复杂度分析 解法二:最小堆 思路 Java 实现 Python 实现 复杂度分析 解法三:桶排序(bucket ...

随机推荐

  1. Flask之模板之特殊变量和方法

    3.6 Flask中的特殊变量和方法: 在Flask中,有一些特殊的变量和方法是可以在模板文件中直接访问的. config 对象: config 对象就是Flask的config对象,也就是 app. ...

  2. wwwroot文件无读取某个文件夹权限(对IIS_USER增加全部权限)

  3. delphi IOS 通知 TNotification

    delphi  IOS 通知 TNotification http://blogs.embarcadero.com/ao/2013/05/01/39450 TNotification http://d ...

  4. git命令用法

    git svn  说明 git pull svn update   git add 要提交的文件名 svn add   git rm svn rm,del   git commit -m '备注一下提 ...

  5. OPEN LDAP

    一.安装OPENLDAP 安装完成后退出 编辑两个文本,输入以下内容,并把文本文件改名为ldap01.ldif和ldap02.ldif. ldap01.ldif: dn: dc=maxcrc,dc=c ...

  6. Codeforces 678E 状压DP

    题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...

  7. 常见的移动端Web页面问题解决方案

    1.安卓浏览器看背景图片,有些设备会模糊. 用同等比例的图片在PC机上很清楚,但是手机上很模糊,原因是什么呢? 经过研究,是devicePixelRatio作怪,因为手机分辨率太小,如果按照分辨率来显 ...

  8. Boost线程详解

    一.创建一个线程 创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针.并且这个函数无参数,并返回void类型. 当一个thre ...

  9. code1052 地鼠游戏

    贪心算法,从后往前 来自codevs的题解: 我的纠结思考过程:如果每一秒都没有重复的地鼠出现 那么肯定是一个一个挨着打如果有重复的地鼠 那么要考虑打那个更优 当然是选分值最大的 单纯这样想很合理 但 ...

  10. ofo开锁共享平台

    http://www.cnblogs.com/mengyu/p/7700980.html