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 triangl
以下算法并不算最优算法
#define MIN_NUM 10000
class Solution {
//用动态规划的思想,从下到上或者从上到下
int min(int a, int b)
{
if (a <= b)
return a;
return b;
}
public:
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int vectorSize = triangle.size();
if (vectorSize == 1)
return triangle[0][0];
vector<int> Level1;
vector<int> Level2;
vector<int> *pPreLevel = &Level1;
vector<int> *pCurLevel = &Level2;
pPreLevel->push_back(triangle[0][0]);
for(int curLevel = 1; curLevel < vectorSize; curLevel++)
{
int curLevelSize = triangle[curLevel].size();
for (int i = 0; i < curLevelSize; i++)
{
if (i == 0)
{
pCurLevel->push_back((*pPreLevel)[0]+triangle[curLevel][i]);
}
else if (i == curLevelSize-1)
{
pCurLevel->push_back((*pPreLevel)[i-1]+triangle[curLevel][i]);
}
else
{
pCurLevel->push_back(min((*pPreLevel)[i-1], (*pPreLevel)[i])+triangle[curLevel][i]);
}
}
vector<int> *pTemp;
pTemp = pPreLevel;
pPreLevel->clear();
pPreLevel = pCurLevel;
pCurLevel = pTemp;
}
int minSum = MIN_NUM;
for(int idx = 0; idx < pPreLevel->size(); idx++)
{
if ((*pPreLevel)[idx] < minSum)
{
minSum = (*pPreLevel)[idx];
}
}
return minSum;
}
};