[LeetCode 题解]: Triangle
2014-05-05 15:01
477 查看
前言
【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 出处: /article/5296472.html 声明: 由于本人水平有限,文章在表述和代码方面如有不妥之处,欢迎批评指正~ |
相关文章推荐
- 【LeetCode】【Python题解】Pascal's Triangle
- LeetCode题解:Triangle
- LeetCode题解:Pascal's Triangle II
- [LeetCode]题解(python):120-Triangle
- Leetcode题解 118. Pascal's Triangle
- LeetCode题解:Triangle
- leetcode_题解_Pascal's Triangle_easy
- [题解][LeetCode][Pascal's Triangle II]
- Leetcode题解 119. Pascal's Triangle II
- leetcode题解-118. Pascal's Triangle && 119. Pascal's Triangle II
- LeetCode题解——Copy List with Random Pointer
- [leetcode, python] Pascal's Triangle II 杨辉三角
- LeetCode: Valid Palindrome 题解
- leetcode题解-36.Valid Sudoku
- [LeetCode] Pascal's Triangle II
- [LeetCode] 118. Pascal's Triangle 杨辉三角
- LeetCode | Pascal's Triangle
- LeetCode - Triangle
- LeetCode题解(Week 1):414. Third Maximum Number
- LeetCode题解:Product of Array Except Self