Leetcode 120. Triangle
2017-02-04 14:28
267 查看
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
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.
s思路:
1. 最小路径和,从上往下,下面的数的坐标只能是上一个数的坐标或坐标加1。枚举所有路径,然后找出最小值?
2. 枚举代码功能正确,但是TLE?那必须是大量重复计算所致。分析如下:
![](https://img-blog.csdn.net/20170204141353579?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlucXJzMDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
如上图,2到5的路径有多条,也就是说从5开始往下遍历需要遍历多次,这就重复计算了!完全可以从上往下计算到每个位置的最小和,然后不断迭代进行,也就是在每个位置计算最小和保存起来。这就是DP的思路!
3. 以后做recursive的题,先看看是否会有重复计算,如有,则用DP!!
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.
s思路:
1. 最小路径和,从上往下,下面的数的坐标只能是上一个数的坐标或坐标加1。枚举所有路径,然后找出最小值?
2. 枚举代码功能正确,但是TLE?那必须是大量重复计算所致。分析如下:
如上图,2到5的路径有多条,也就是说从5开始往下遍历需要遍历多次,这就重复计算了!完全可以从上往下计算到每个位置的最小和,然后不断迭代进行,也就是在每个位置计算最小和保存起来。这就是DP的思路!
3. 以后做recursive的题,先看看是否会有重复计算,如有,则用DP!!
//方法1:recursive的枚举所有路径。TLE? class Solution { public: void helper(vector<vector<int>>& triangle,int level,int pos,int&path,int cur){ if(level==triangle.size()){ path=path<cur?path:cur; return; } helper(triangle,level+1,pos,path,cur+triangle[level][pos]); if(pos+1<triangle[level].size()) helper(triangle,level+1,pos+1,path,cur+triangle[level][pos+1]); } int minimumTotal(vector<vector<int>>& triangle) { // int path=INT_MAX; helper(triangle,0,0,path,0); return path; } }; //方法2:dp class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { // int n=triangle.size(); int path=INT_MAX; for(int i=1;i<n;i++){ triangle[i][0]+=triangle[i-1][0]; triangle[i][i]+=triangle[i-1][i-1]; for(int j=1;j<i;j++){ triangle[i][j]+=min(triangle[i-1][j],triangle[i-1][j-1]); } } for(int i=0;i<n;i++){ path=min(path,triangle[n-1][i]); } return path; } };
相关文章推荐
- 120. Triangle LeetCode
- LeetCode - 120. Triangle
- leetcode 120. Triangle
- leetcode 120. Triangle
- LeetCode 120. Triangle
- 【一天一道LeetCode】#120. Triangle
- LeetCode 120. Triangle
- leetcode 120. Triangle
- leetcode120. Triangle
- LeetCode120. Triangle
- 【LeetCode】120. Triangle 基于C++和Java的分析及解法,动态规划
- LeetCode 120. Triangle
- LeetCode *** 120. Triangle
- LeetCode 120. Triangle (Python)最优解--Apolo_Shane
- Leetcode 120. Triangle
- Leetcode-120. Triangle
- [leetcode]120. Triangle
- leetcode题解-120. Triangle
- 【LeetCode】120. Triangle
- [LeetCode] 120. Triangle