首页 > 代码库 > LeetCode: Triangle
LeetCode: Triangle
LeetCode: Triangle
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.
地址:https://oj.leetcode.com/problems/triangle/
算法:开两个大小为n的数组,假设我们已经完成了前面i行的搜索,其中以第i行第j个元素为终节点的最小路径的和存储在其中某个数组里,假设这个数组用指针pre指向。接下去,我们要完成第i+1行的搜索,其中以第i+1行第j个元素为终节点的路径必定是从第i行第j个节点或者第i行第j+1个节点下来的,所有在计算最小路径时只需考虑这两个路径,并把结果存储在另一个数组里,这个数组用指针p指向。由于在每一次搜索的过程中只需要上一次的结果,所以我们只用了两个数组,并且用指针pre和指针p来重复利用这两个数组,这样就可以达到O(n)的空间要求。代码:
1 class Solution { 2 public: 3 int minimumTotal(vector<vector<int> > &triangle) { 4 int n = triangle.size(); 5 if(n < 1) return 0; 6 if(n == 1) return triangle[0][0]; 7 vector<int> min1(n); 8 vector<int> min2(n); 9 min1[0] = triangle[0][0];10 vector<int> *pre = &min1;11 vector<int> *p = &min2;12 for(int i = 1; i < n; ++i){13 for(int j = 0; j <= i; ++j){14 if(j == 0){15 (*p)[j] = (*pre)[j] + triangle[i][j];16 }else if(j == i){17 (*p)[j] = (*pre)[j-1] + triangle[i][j];18 }else{19 (*p)[j] = ( (*pre)[j] > (*pre)[j-1] ? (*pre)[j-1] : (*pre)[j] ) + triangle[i][j];20 }21 }22 vector<int> *t = pre;23 pre = p;24 p = t;25 }26 int result = (*pre)[0];27 for(int i = 1; i < n; ++i){28 if (result > (*pre)[i]) result = (*pre)[i];29 }30 return result;31 }32 33 };
LeetCode: Triangle