120. 三角形最小路徑和(JS實現)

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);
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章