給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。java
例如,給定三角形:算法
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
自頂向下的最小路徑和爲 11(即,2 + 3 + 5 + 1 = 11)。code
說明:blog
若是你能夠只使用 O(n) 的額外空間(n 爲三角形的總行數)來解決這個問題,那麼你的算法會很加分。圖片
從第一層到最後一層,每層中元素[i, j]
的相鄰父元素爲[i -1, j - 1]
與[i -1, j ]
,
參考圖論中的Dijkstra算法
,採起從頂點開始向外搜索,計算到達各節點的最短路徑的方法;
因爲題目中的圖(樹?)每層間都是單向的,因此沒必要每次循環更新全部節點的最短路徑,只需從頂層開始逐層計算從頂點到各節點的最短距離,並直接更新到該節點,最後從最底層取出值最小的元素即爲題解:內存
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
我自認爲空間複雜度爲 O(1)
時間複雜度:O(n^2)io