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.
Subscribe to see which com
用递归超时,通不过。
迭代-动态规划:
1.从上往下遍历 :求每一层,到每个位置的路径最小值,下一层的每个位置的路径最小值只与前一层的某一条(第一个位置和最后一个位置)或者两条路径相关。即通过求前一阶段(每个位置)的最优解推出下一阶段(每个位置)的最优解。
class Solution {
public:
/*int dfs(vector<vector<int>>& triangle,int index,int level){
if(level>=triangle.size())
return 0;
if(index+1>=triangle[level].size())
return triangle[level][index]+dfs(triangle,index,level+1);
return min(triangle[level][index]+dfs(triangle,index,level+1),triangle[level][index+1]+dfs(triangle,index+1,level+1));
}
*/
int minimumTotal(vector<vector<int>>& triangle) {
//return dfs(triangle,0,0);//超时
if(triangle.size()<=0)
return 0;
int ret=INT_MAX;
vector<vector<int>> flg=triangle;
int level=1;
for(;level<triangle.size();level++){
for(int index=0;index<triangle[level].size();index++){
if(index==0)
flg[level][index]=triangle[level][index]+flg[level-1][index];
else if(index==triangle[level].size()-1)
flg[level][index]=triangle[level][index]+flg[level-1][index-1];
else
flg[level][index]=triangle[level][index]+min(flg[level-1][index-1],flg[level-1][index]);
}
}
level--;
for(int index=0;index<flg[level].size();index++){
ret=ret>flg[level][index]?flg[level][index]:ret;
}
return ret;
}
};
2.从下往上遍历,思路差不多,但是不需要考虑第一个和最后一个位置只有一条路径的情况
参考:http://www.tuicool.com/articles/i22yam
int minimumTotal(vector<vector<int>>& triangle) {
//return dfs(triangle,0,0);//超时
if(triangle.size()<=0)
return 0;
vector<vector<int>> flg=triangle;
int level=triangle.size()-2;
for(;level>=0;level--){
for(int index=0;index<triangle[level].size();index++){
flg[level][index]=triangle[level][index]+min(flg[level+1][index+1],flg[level+1][index]);
}
}
return flg[0][0];
}