LeetCode——Triangle(120)
阿新 • • 發佈:2018-12-10
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.
分析:
設有一個和上圖三角形一樣大小的表,表裡的每個位置表示走到當前路徑所花費的最小代價。有遞推式子:
dp[i][j] = dp[i][j]+min{ dp[i-1][j], dp[i-1][j-1] },
意思是走到當前位置的最小花費等於 當前位置路徑的開銷+上一層能選擇當前路徑的位置裡開銷最小的那個。
程式碼實現的時候有個trick,可以只使用o(n)(n指的是三角形的行數)的空間,申請一個int[n],然後從後往前更新陣列,這樣就可以節省空間。
程式碼:
class Solution { public: int min(int a, int b) { return a<=b?a:b; } int minimumTotal(vector<vector<int>>& triangle) { vector<int>res(triangle.size(),0); for(int i=0;i<triangle.size();++i) { for(int j=triangle[i].size()-1;j>=0;--j) { int l, r; l=j-1>=0?j-1:0; r=j<triangle[i-1].size()?j:triangle[i-1].size()-1; res[j]=min(res[l], res[r])+triangle[i][j]; } } int min = res[0]; for(int i=1;i<res.size();++i) if(min>res[i]) min=res[i]; return min; } };