Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
Notice
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.
动态规划
设sum[i][j]为从(i,j)从出发的最短路径长度。
sum[i][j]=triangle[i][j]+min(sum[i+1][j]+sum[i+1][j+1]);
因为每层的值都是只跟它的下一层有关系,所以只需要开辟一维数组,即
sum[j]=triangle[i][j]+min(sum[j]+sum[j+1]);
class Solution {
public:
/**
* @param triangle: a list of lists of integers.
* @return: An integer, minimum path sum.
*/
int minimumTotal(vector<vector<int> > &triangle) {
// write your code here
int rowSize=triangle.size();
int colSize=triangle[rowSize-1].size();
vector<vector<int> >sum(rowSize,vector<int>(colSize));
for(int j=0;j<colSize;j++){
sum[rowSize-1][j]=triangle[rowSize-1][j];
}
for(int i=rowSize-2;i>=0;i--){
for(int j=0;j<=i;j++){
int min=sum[i+1][j];
if(min>sum[i+1][j+1]){
min=sum[i+1][j+1];
}
sum[i][j]=triangle[i][j]+min;
}
}
return sum[0][0];
}
};
class Solution {
public:
/**
* @param triangle: a list of lists of integers.
* @return: An integer, minimum path sum.
*/
int minimumTotal(vector<vector<int> > &triangle) {
// write your code here
int rowSize=triangle.size();
int colSize=triangle[rowSize-1].size();
vector<int>sum(colSize);
for(int j=0;j<colSize;j++){
sum[j]=triangle[rowSize-1][j];
}
for(int i=rowSize-2;i>=0;i--){
for(int j=0;j<=i;j++){
int min=sum[j];
if(min>sum[j+1]){
min=sum[j+1];
}
sum[j]=triangle[i][j]+min;
}
}
return sum[0];
}
};
2.记忆化搜索