【LeetCode】triangle求最小和路徑
阿新 • • 發佈:2019-02-10
今天閒來無事,做了三道leetcode水題,怒更兩發部落格,也挺不錯。今天更新的兩篇都是dp解法的簡單題。
- 題目要求如下。
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)的空間複雜度,想了想一般動規可能需要O(
n2 )的空間,如何可以只用O(n)呢,稍微腦筋一轉就想到沒有必要儲存從根到每個節點的路徑和啊!我們計算到第幾行只需要儲存當前行各節點的最短路徑和,之前的我們根本不care,所以申請一個n的陣列,每次都可以覆蓋之前的。但要注意一個小地方,更新每一行的路徑時,要從右側開始,否則上一行的最短就會被覆蓋掉了。
- AC程式碼
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
int n = triangle.size();
if (n==0) return 0;
if (n==1) return triangle[0][0];
int dp[n+1];
int Min = INT_MAX;
for (int i=0;i<n+1;i++)
dp[i]=INT_MAX;
dp[1 ] = triangle[0][0];
for (int i=1;i<n;i++){
for (int j=i+1;j>0;j--){
dp[j]=min(dp[j-1],dp[j])+triangle[i][j-1];
if (i==n-1&&dp[j]<Min){
Min = dp[j];
}
}
}
return Min;
}
};