120.Triangle
Description:
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).
分析:
针对每一层的每个数得到的最小和由其上方相邻的小者加这个数得到,每层迭代得到该层的所有结果,迭代到最底层后取最小值即可。由于每一层只用到前一层的结果,最多只需O(n)的空间。这是自顶向下的方法,看了leetcode上别人分享的自底向上的方法,感觉自底向上的比较巧妙,反过来看整个过程,最后最顶端的就是解。
My C++code:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
vector<int> pre(triangle.size(), 0);
vector<int> cur(pre);
cur[0] = pre[0] = triangle[0][0];
for(int j = 1; j < triangle.size(); ++j)
{
for(int i = 0; i < triangle[j].size(); ++i)
{
if(i == 0)
{
cur[0] = pre[0] + triangle[j][0];
}
else if(i == triangle[j].size() - 1)
{
cur[i] = pre[i-1] + triangle[j][i];
}
else
{
cur[i] = min(pre[i-1], pre[i]) + triangle[j][i];
}
}
pre = cur;
}
sort(cur.begin(), cur.end());
return cur.front();
}
};