1. 程式人生 > >【LeetCode】triangle求最小和路徑

【LeetCode】triangle求最小和路徑

今天閒來無事,做了三道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; } };