給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。面試
例如,給定三角形:算法
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
複製代碼
自頂向下的最小路徑和爲 11
(即,2 + 3 + 5 + 1 = 11)。數組
若是你能夠只使用 O(n) 的額外空間(n 爲三角形的總行數)來解決這個問題,那麼你的算法會很加分。bash
這裏有兩種方法能夠進行求解測試
1 回溯法(枚舉),找到每個值,而後返回,比較大小,找出最小值。(leetcode過不了,最後一個測試用例會超時)ui
2 動態規劃:spa
class Solution {
int min = Integer.MAX_VALUE;
int sum = 0;
public int minimumTotal(List<List<Integer>> triangle) {
int i = 0, j = 0;
helper(triangle, i, j);
return min;
}
private void helper(List<List<Integer>> triangle, int i, int j) {
if (i == triangle.size()) {
min = Math.min(sum, min);
return;
}
sum += triangle.get(i).get(j);
helper(triangle, i + 1, j);
helper(triangle, i + 1, j + 1);
sum -= triangle.get(i).get(j);
}
}
複製代碼
代碼2:3d
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int[] mini = new int[triangle.size() + 1];
for (int i = triangle.size() - 1; i >= 0; i--) {
for (int j = 0; j < triangle.get(i).size(); j++) {
mini[j] = triangle.get(i).get(j) + Math.min(mini[j], mini[j + 1]);
}
}
return mini[0];
}
}
複製代碼
結果2:code
回溯法,須要把整個數組的每一條路徑都遍歷一遍,時間複雜度是O(n的平方),最後一個測試用例會超時,可是也是一種解決問題的辦法,面試的話也能夠考慮使用,代碼很是簡潔,可讀性比較強。cdn
動態規劃這裏用了一個小技巧,用一維數組去記錄子問題的最優解,能夠省一個維度的內存空間,代碼也比較簡潔。