159 - 120 三角形最小路径和
题目
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[ [2], [3,4], [6,5,7], [4,1,8,3] ] 自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
解答
一开始想法是用贪心,每次都选择下一行的最小值。结果遇到了一个反例:
[[-1], [2, 3], [1, -1, -3]]
,这个走-1, 3, -3
是最小值-1
,但如果是贪心的话,只能取到0。
动态规划:自下而上
var minimumTotal = function(triangle) {
for (let i = triangle.length - 2; i >= 0; i--) {
for (let j = 0; j < triangle[i].length; j++) {
triangle[i][j] += Math.min(triangle[i + 1][j], triangle[i + 1][j + 1])
}
}
return triangle[0][0]
};
Runtime: 56 ms, faster than 73.89% of JavaScript online submissions for Triangle.
Memory Usage: 34.9 MB, less than 100.00% of JavaScript online submissions for Triangle.
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
for i in range(len(triangle)-2, -1, -1):
for j in range(0, len(triangle[i])):
triangle[i][j] += min(triangle[i+1][j],
triangle[i+1][j+1])
return triangle[0][0]
Runtime: 52 ms, faster than 99.32% of Python3 online submissions for Triangle.
Memory Usage: 13.6 MB, less than 33.33% of Python3 online submissions for Triangle.
func min(a, b int) int {
if a < b {
return a
}
return b
}
func minimumTotal(triangle [][]int) int {
for i := len(triangle) - 2; i >= 0; i-- {
for j := 0; j < len(triangle[i]); j++ {
triangle[i][j] += min(triangle[i+1][j], triangle[i+1][j+1])
}
}
return triangle[0][0]
}
Runtime: 4 ms, faster than 94.83% of Go online submissions for Triangle.
Memory Usage: 3.1 MB, less than 100.00% of Go online submissions for Triangle.
Last updated
Was this helpful?