LeetCode解題報告 120. Triangle [medium]

conniemessi發表於2016-12-03

題目描述

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.


解題思路

採用由底向上傳輸的思路,在每兩層之間找到最小值,不斷向上傳遞並相加,最後頂點的值儲存的就是所求的最小值。
對於從倒數第二層開始的每個點,可選擇從左下方的點或者從右下方的點走這條最終的最短路,因此比較左右下方的兩個結點,取最小值,再加上自己本身,就是這個小三角形區域的最短路。對倒數第二層的每一個結點都做同樣的操作,每個結點都儲存的是自己所在的小三角形的最短路的和。然後依次計算倒數第三層...,直到最頂點。
狀態轉移方程如下:
tra[i][j]=tra[i][j]+min(tra[i+1][j+1], tra[i+1][j])
return tra[0][0]

圖示如下:



複雜度分析

O(n*n)的時間複雜度。

程式碼如下:
class Solution {
public:
    int minimumTotal(vector<vector<int>>& triangle) {
        int n=triangle.size();
        if (n==0) {
            return 0;
        }
        else if (n==1) {
            return triangle[0][0];
        }
        else{
            for (int i = n-2; i>=0;--i)
            {
                for (int j=0; j<=i; j++) {
                    triangle[i][j]+=min(triangle[i+1][j],triangle[i+1][j+1]);
                }
            }
            return triangle[0][0];
        }
    }
};



相關文章