题目大意:
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, wheren is the total number of rows in the triangle.
意思就是:
给定一个三角形,求得和最小的路径。每层只能选一个整数,上一层和下一层的整数必须是相邻的。
思路:
1,动态规划。到第i层的第k个顶点的最小路径长度表示为f(i,k),则f(i, k) = min{f(i-1,k), f(i-1,k-1)} + d(i, k); 其中d(i, k)表示原来三角形数组里的第i行第k列的元素。则可以求得从第一行到最终到第length-1行第k个元素的最小路径长度,最后再比较第length-1行中所有元素的路径长度大小,求得最小值。
2,本题主要关心的是空间复杂度不要超过n。
3,注意边界条件——每一行中的第一和最后一个元素在上一行中只有一个邻居。而其他中间的元素在上一行中都有两个相邻元素。
代码如下:
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
vector< vector<int> >::size_type length = triangle.size();
if(length == 0){
return 0;
}
int i, j;
for(i=1;i<length;i++){
vector<int>::size_type length_inner = triangle[i].size();
for(j=0;j<length_inner;j++){
if(j == 0){
triangle[i][j] = triangle[i][j] + triangle[i-1][j];
}
else if(j == length_inner - 1){
triangle[i][j] = triangle[i][j] + triangle[i-1][j-1];
}
else{
triangle[i][j] = (triangle[i][j] + triangle[i-1][j-1] < triangle[i][j] + triangle[i-1][j] ? triangle[i][j] + triangle[i-1][j-1]:triangle[i][j] + triangle[i-1][j]);
}
}
}
int min_path = triangle[length-1][0];
for(i=1;i<triangle[length-1].size();i++){
min_path = (min_path < triangle[length-1][i]?min_path:triangle[length-1][i]);
}
return min_path;
}
};
补充:
最开始我的思路很靠近正确思路,但还是想错了,当时想的是,求得第i行最小路径的顶点k,至此,到第i行的顶点就确定了,同时继续重复相同的动作,直到最后一行。
错误代码如下:
class Solution{
public:
int minimumTotal(vector< vector<int> > &triangle){
vector< vector<int> >::size_type length = triangle.size();
int i, j;
int min_sum = *(triangle[0].begin());
int current_index = 0;
for(i=1;i<length;i++){
//vector<int>::size_type length_inner = triangle[i].size();
if(min_sum + triangle[i][current_index] < min_sum + triangle[i][current_index+1]){
min_sum = min_sum + triangle[i][current_index];
}
else{
min_sum = min_sum + triangle[i][current_index+1];
current_index = current_index + 1;
}
}
return min_sum;
}
};