返回
解密力扣第120题:精通三角形最小路径和!
后端
2023-11-15 01:00:32
算法竞赛高手汇聚之地——力扣,众多难题备受关注,其中也不乏经典之作,例如第120题《三角形最小路径和》。这是一道颇具挑战性的问题,它不仅考验你的算法思维,也考察了你对细节的把控能力。
为了让你能够直面挑战,我将用最直白、最容易理解的方式带你攻克这个难题,希望你能够举一反三,并在其他题目中灵活运用。
题目解读:
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一层三角形的数字只能从上一层的两个数字中选择一个。
例如:
triangle = [[2],
[3, 4],
[6, 5, 7],
[4, 1, 8, 3]]
输出:11
解释:从顶部选择 2,下一层选择 3,下一层选择 5,最后选择 1,最小路径和为 11。(即,2 + 3 + 5 + 1 = 11)
动态规划算法:
力扣第120题的本质是一道动态规划问题。动态规划算法是一种将大问题分解成一系列小问题,然后逐步解决这些小问题,最终得到大问题的解。动态规划算法通常由以下几个步骤组成:
-
明确子问题: 将大问题分解成一系列较小的问题,这些子问题通常具有相似的结构。
-
存储子问题的解: 在解决子问题时,将子问题的解存储起来,以备后用。这将避免重复计算相同的子问题。
-
利用子问题的解来解决大问题: 通过组合子问题的解,可以逐步解决大问题。
解题步骤:
-
定义状态: 令dp[i][j]表示从三角形的顶点到第i行第j列的最小路径和。
-
初始化: 对于第0行,dp[0][0]显然等于triangle[0][0]。
-
状态转移方程: 对于第i行第j列,dp[i][j]可以由以下两种情况得到:
- 从dp[i-1][j-1]转移过来:这种情况下,我们选择上一行的左边数字。
- 从dp[i-1][j]转移过来:这种情况下,我们选择上一行的右边数字。
因此,dp[i][j]的计算公式为:
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]
-
边界条件: 对于每一行,我们只需要计算到该行的最后一个元素。
示例解析:
我们以题目中的例子来演示一下算法的运行过程:
triangle = [[2],
[3, 4],
[6, 5, 7],
[4, 1, 8, 3]]
- 初始化:
dp[0][0] = 2
- 状态转移:
dp[1][0] = min(dp[0][0]) + triangle[1][0] = 2 + 3 = 5
dp[1][1] = min(dp[0][0]) + triangle[1][1] = 2 + 4 = 6
- 继续状态转移,直至最后一层:
dp[2][0] = min(dp[1][0], dp[1][1]) + triangle[2][0] = 5 + 6 = 11
dp[2][1] = min(dp[1][0], dp[1][1]) + triangle[2][1] = 5 + 5 = 10
dp[2][2] = min(dp[1][1], dp[1][2]) + triangle[2][2] = 6 + 7 = 13
dp[3][0] = min(dp[2][0], dp[2][1]) + triangle[3][0] = 11 + 4 = 15
dp[3][1] = min(dp[2][0], dp[2][1]) + triangle[3][1] = 11 + 1 = 12
dp[3][2] = min(dp[2][1], dp[2][2]) + triangle[3][2] = 10 + 8 = 18
dp[3][3] = min(dp[2][2], dp[2][3]) + triangle[3][3] = 13 + 3 = 16
- 结果:
最小路径和 = dp[3][3] = 16
复杂度分析:
- 时间复杂度:O(n^2),其中n为三角形的行数。
- 空间复杂度:O(n^2),因为我们需要存储dp数组。
总结:
力扣第120题的解法体现了动态规划算法的强大之处。通过将大问题分解成一系列较小的子问题,并通过存储子问题的解来避免重复计算,我们最终得到了问题的最优解。这道题既考验了你的算法思维,也考察了你对细节的把控能力。希望你能够从中有所收获,并在其他的算法竞赛中取得好成绩!