1 題目
給定一個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裏指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
例如,給定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自頂向下的最小路徑和爲 11(即,2 + 3 + 5 + 1 = 11)。
說明:
如果你可以只使用 O(n) 的額外空間(n 爲三角形的總行數)來解決這個問題,那麼你的算法會很加分。
2 思路
這道題的主要思路用一個數組d
來存儲每層每個數的最小路徑和,其中d[i]
代表某層經過第i
個數的最小路徑和,下一層比上一層總是多一個數,因此除首尾兩個數外,狀態轉移方程爲dNext[i] = Math.min(d[i-1], d[i]) + arr[i]
3代碼
/**
* @param {number[][]} triangle
* @return {number}
*/
var minimumTotal = function(triangle) {
if (triangle.length === 0) return 0;
if (triangle.length === 1) return triangle[0][0];
let d = [triangle[0][0]];
let m = triangle.length;
for (let i=1; i<m; i++) {
let temp = [];
let arr = triangle[i];
let len = arr.length;
temp[0] = d[0] + arr[0]; //首尾兩個數直接加上就好
temp[len- 1] = d[d.length-1] + arr[len - 1];
for (let j=1; j<len-1; j++) {
temp[j] = Math.min(d[j-1], d[j]) + arr[j];
}
d = temp;
}
return Math.min(...d);
};