给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11
(即,2 + 3 + 5 + 1 = 11)
解题思路:
贪婪算法
使每一步都是当前最优,也就是说triangle[i][j]等于自己加上可选的最小值,对边界做一下判断
代码:
class Solution:
def minimumTotal(self, triangle: List[List[int]]) -> int:
l = len(triangle)
for i in range(1, len(triangle)):
for j in range(len(triangle[i])):
if j == 0:
triangle[i][j] += triangle[i-1][j]
elif j == len(triangle[i])-1:
triangle[i][j] += triangle[i-1][j-1]
else:
triangle[i][j] += min(triangle[i-1][j], triangle[i-1][j-1])
return min(triangle[l-1])
给定一个方形整数数组 A
,我们想要得到通过 A
的下降路径的最小和。
下降路径可以从第一行中的任何元素开始,并从每一行中选择一个元素。在下一行选择的元素和当前行所选元素最多相隔一列。
示例:
输入:[[1,2,3],[4,5,6],[7,8,9]]
输出:12
解释:
可能的下降路径有:
[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
[3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]
和最小的下降路径是 [1,4,7]
,所以答案是 12
。
还是贪婪算法,思路同上
class Solution:
def minFallingPathSum(self, A: List[List[int]]) -> int:
l = len(A)
for i in range(1, l):
for j in range(len(A[i])):
if j == 0:
A[i][j] += min(A[i-1][j], A[i-1][j+1])
elif j == len(A[i])-1:
A[i][j] += min(A[i-1][j-1], A[i-1][j])
else:
A[i][j] += min(A[i-1][j], A[i-1][j-1], A[i-1][j+1])
return min(A[l-1])