题目要求:给出一个三角形的二维数组,即第一行有一个元素,第二行有两个元素……求出从上到下的最短路径。从上到下选择数组元素的时候只能选择相邻的两个元素。
问题解答:动态规划算法,采用自底向上的方法.假设用nums二维数组来存储从上到下面每一个元素的最短路径,则nums[i][j]=min(nums[i-1][j-1],nums[i-1][j])+triangle[i][j]。为了使空间复杂度降到O(n),用一个一维数组来存储从第一层到下面每一层的每个元素的最短路径。可以迭代更新一维数组的值。
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n=triangle.size();
vector<int> sum(n,0);
sum[0]=triangle[0][0];
for(int i=1;i<n;i++){
for(int j=triangle.size()-1;j>=0;j--){
int temp;
if(j==0){
temp=sum[j];
}
else if(j==triangle[i].size()-1){
temp=sum[j-1];
}
else{
temp=sum[j]>sum[j-1]?sum[j-1]:sum[j];
}
sum[j]=temp+triangle[i][j];
}
}
int result=sum[0];
for(int i=1;i<n;i++){
result=result>sum[i]?sum[i]:result;
}
return result;
}
};