LeetCode-Triangle
题目是给定一个三角形,求最小的路径和,每一步只能移动到它的相邻列,这条规则要看清楚,意思是第i行的第j列只能移动到第 i + 1 行的第j列或j + 1列。这题也比较简单,依然是DP的思路,保存每一行每一列的从顶端到该元素的最小和即可。
题目下面的这个提示不是很理解:
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.
按照我上面的方法根本就不需要额外的空间,直接在给的三角形上从上到下逐步更新每个元素的最小和就可以了,最后的解就是最后一行的所有元素的最小值。
1 class Solution { 2 public: 3 int minimumTotal(vector<vector<int> > &triangle) { 4 // Start typing your C/C++ solution below 5 // DO NOT write int main() function 6 int ret = 0; 7 int h = triangle.size(); 8 for (int i = 1; i < h; i++) { 9 for (int j = 0; j <= i; j++) { 10 if (j == 0) { 11 triangle[i][j] += triangle[i - 1][j]; 12 } 13 if (j == i) { 14 triangle[i][j] += triangle[i - 1][j - 1]; 15 } 16 if (j != 0 && j != i) { 17 triangle[i][j] += std::min(triangle[i - 1][j - 1], triangle[i -1][j]); 18 } 19 } 20 } 21 ret = triangle[h - 1][0]; 22 for (int k = 1; k < h; k++) { 23 if (triangle[h - 1][k] < ret) { 24 ret = triangle[h - 1][k]; 25 } 26 } 27 return ret; 28 } 29 };