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.
经典的动态规划题目。
由于下层只和上层有关系,所以只需要记录上层的信息即可。
这样就把O(n^2)的空间复杂度压缩成了O(n)。
class Solution {
public:
int minimumTotal(vector<vector<int> > &triangle) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int n = triangle.size();
int f[2][n], idx = 0;
memset(f, 0, sizeof(int) * 2 * n);
for (int i = 0; i < n; i++) {
for (int j = 0; j <= i; j++) {
f[idx][j] = triangle[i][j];
if (i != 0 && j == i) {
f[idx][j] += f[1 - idx][j - 1];
}
else if (j == 0) {
f[idx][j] += f[1 - idx][j];
}
else {
f[idx][j] += f[1 - idx][j] < f[1 - idx][j - 1] ? f[1 - idx][j] : f[1 - idx][j - 1];
}
}
idx = 1 - idx;
}
int answer = f[1 - idx][0];
for (int i = 1; i < n; i++) {
answer = f[1 - idx][i] < answer ? f[1 - idx][i] : answer;
}
return answer;
}
};