【题目】
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.
【题意】
给定一个三角,要求从第一层到最后一层的最小路径和,每一步只能移动到下一层的相邻位置,如果当前在A[r][i],表示在第r层的第i个位置,则下一步可以移动到A[r+1][i]或者A[r+1][i+1]位置。
题目要求只能申请O(n)的额外空间,其中n为层数
【思路】
【代码】
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
int size=triangle.size();
if(size==0)return 0;
vector<int> row1(size, 0); //存储奇数行结果
vector<int> row2(size, 0); //存储偶数行结果
int rowNo=1; //记录当前正在计算的行号,初始化为1表示我们正在计算从第一层到第一层的最短路径和
//初始化row1
row1[0]=triangle[0][0];
//依次计算到达各层各位置的最短路径和
while(rowNo<size){
rowNo++;
if(rowNo%2==0){
//从row1得到rowNo行上各位置的最短路径和,并保存到row2中
for(int i=0; i<rowNo; i++){
if(i==0) row2[i]=row1[i]+triangle[rowNo-1][i];
else if(i==rowNo-1) row2[i]=row1[i-1]+triangle[rowNo-1][i];
else row2[i]=min(row1[i]+triangle[rowNo-1][i], row1[i-1]+triangle[rowNo-1][i]);
}
}
else{
//从row2得到rowNo行上各位置的最短路径和,并保存到row1中
for(int i=0; i<rowNo; i++){
if(i==0) row1[i]=row2[i]+triangle[rowNo-1][i];
else if(i==rowNo-1) row1[i]=row2[i-1]+triangle[rowNo-1][i];
else row1[i]=min(row2[i]+triangle[rowNo-1][i], row2[i-1]+triangle[rowNo-1][i]);
}
}
}
//size是偶数,则从row2获取全局的最短路径和,反之,从row1中获取全局的最短路径和
int minPathSum=INT_MAX;
if(size%2==0){
for(int i=0; i<size; i++)
if(row2[i]<minPathSum)minPathSum=row2[i];
}
else{
for(int i=0; i<size; i++)
if(row1[i]<minPathSum)minPathSum=row1[i];
}
return minPathSum;
}
};