Skip to content

Code:

js
/**
 * @param {number[][]} triangle
 * @return {number}
 */

// 递归 + 记忆化搜索
var minimumTotal = function(triangle) {
    // const dp = Array(triangle.length).fill(Number.MAX_SAFE_INTEGER)
    const map =  new Map()

    const dfs = (row = 0, i = 0) => {
        if (map.has(`${row}-${i}`)) {
            return map.get(`${row}-${i}`)
        }

        if (row >= triangle.length) {
            return 0
        }

        if (i >= triangle[row].length) {
            return 0
        }
        
        const min = Math.min(dfs(row + 1, i) + triangle[row][i], dfs(row + 1, i + 1) + triangle[row][i])

        return map.set(`${row}-${i}`, min).get(`${row}-${i}`)
    }

    return dfs()
};

// dp ?
var minimumTotal = function(triangle) {
    let i = triangle.length
    const dp = []

    for (const t of triangle[--i]) {
        dp.push(t)
    }

    while(i--) {
        for (let j = 0; j < i + 1; j++) {
            dp[j] = Math.min(dp[j], dp[j + 1]) + triangle[i][j]
        }
    }

    return dp[0]
};


console.log(minimumTotal([[-1],[-1000,3],[1,-1,-100], [-10000, -1000, 0, 1000]]))

❤ With Algorithm