LeetCode刷題: 【120】三角形最小路徑和

1. 題目:

給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。java

例如,給定三角形:算法

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

自頂向下的最小路徑和爲 11(即,2 + 3 + 5 + 1 = 11)。code

說明:blog

若是你能夠只使用 O(n) 的額外空間(n 爲三角形的總行數)來解決這個問題,那麼你的算法會很加分。圖片

2. 解題思路

從第一層到最後一層,每層中元素[i, j]的相鄰父元素爲[i -1, j - 1][i -1, j ],
參考圖論中的Dijkstra算法,採起從頂點開始向外搜索,計算到達各節點的最短路徑的方法;
因爲題目中的圖(樹?)每層間都是單向的,因此沒必要每次循環更新全部節點的最短路徑,只需從頂層開始逐層計算從頂點到各節點的最短距離,並直接更新到該節點,最後從最底層取出值最小的元素即爲題解:內存

3. 代碼 JAVA

class Solution {

    public int minimumTotal(List<List<Integer>> triangle) {
        int i = 0, j = 0;// 循環變量(爲節省空間因此單獨定義)
        int pe, af;// 暫存父節點值
        
        // 逐層計算最短路徑,第一層沒必要計算
        for (i = 1; i < triangle.size(); i++) {
            // 每行第一個元素只有一個父元素
            triangle.get(i).set(0, triangle.get(i - 1).get(0) + triangle.get(i).get(0));
            for (j = 1; j < i; j++) {
                pe = triangle.get(i - 1).get(j);
                af = triangle.get(i - 1).get(j - 1);
                if (pe < af)// 將較小的父元素加到當前節點,更新最短路徑
                    triangle.get(i).set(j, pe + triangle.get(i).get(j));
                else
                    triangle.get(i).set(j, af + triangle.get(i).get(j));
            }
            // 每行最後一個元素只有一個父元素
            triangle.get(i).set(i, triangle.get(i - 1).get(i - 1) + triangle.get(i).get(i));
        }
        // 取出最後一層中最小的路徑
        return Collections.min(triangle.get(triangle.size() - 1));
    }

}

最優提交結果:
執行用時 : 7 ms, 在Triangle的Java提交中擊敗了53.31% 的用戶
內存消耗 : 35.1 MB, 在Triangle的Java提交中擊敗了96.99% 的用戶
*****
在這裏插入圖片描述
*****
以後每次從新提交結果都不同,不知道爲啥get

4. 複雜度

我自認爲空間複雜度爲 O(1)
時間複雜度:O(n^2)io

相關文章
相關標籤/搜索