LeetCode 120. 三角形最小路徑和(C、C++、python)
阿新 • • 發佈:2018-12-16
給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
例如,給定三角形:
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
自頂向下的最小路徑和為 11
(即,2 + 3 + 5 + 1 = 11)。
說明:
如果你可以只使用 O(n) 的額外空間(n 為三角形的總行數)來解決這個問題,那麼你的演算法會很加分。
C
int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes) { int n=triangleRowSize; int* tmp=triangle[n-1]; for(int i=n-2;i>=0;i--) { int m=triangleColSizes[i]; for(int j=0;j<m;j++) { int min=tmp[j]<tmp[j+1]?tmp[j]:tmp[j+1]; tmp[j]=triangle[i][j]+min; } } return tmp[0]; }
C++
class Solution { public: int minimumTotal(vector<vector<int>>& triangle) { int n=triangle.size(); vector<int> tmp=triangle[n-1]; for(int i=n-2;i>=0;i--) { int m=triangle[i].size(); for(int j=0;j<m;j++) { tmp[j]=triangle[i][j]+min(tmp[j],tmp[j+1]); } } return tmp[0]; } };
python
class Solution: def minimumTotal(self, triangle): """ :type triangle: List[List[int]] :rtype: int """ n=len(triangle) tmp=triangle[n-1] for i in range(n-2,-1,-1): m=len(triangle[i]) for j in range(m): tmp[j]=triangle[i][j]+min(tmp[j],tmp[j+1]) return tmp[0]