LeetCode笔记 用动态规划解决【120 三角形最小路径和】

给定一个三角形 triangle ,找出自顶向下的最小路径和。

每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 ii + 1

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

示例 2:

输入:triangle = [[-10]]
输出:-10

思路

贪心算法

此题很容易想到使用贪心算法求解,既从顶点开始,每一步都选择值最小的点向下前进。在示例提供的数据中这种算法可以找到最优解。但需要考虑在一些情况下,贪心算法仅能找到局部最优解,例如:

   2
  3 4
 8 9 1
7 6 5 2
本例使用贪心算法获取的路径为:(2-3-8-6)但实际最优解为(2-4-1-2)
动态规划

这道题目其实类似于背包问题,天然适用与动态规划,甚至于我们可以直接在现有的三角形上构建动态规划矩阵。核心思路为:

  • 计算第一行节点的最小路径和(其实就是数字本身,不用做处理)
  • 从第二行开始,根据当前行与上一行,计算到每一行各个节点的最小路径和
  • 找到最后一行中最小的路径和节点,即为这个三角形的最小路径和

例如刚才提到的三角形:

   2
  3 4
 8 9 1
7 6 5 2

计算第二行

  (2)
 (5 6)
 8 9 1
7 6 5 2

计算第三行

   (2)
  (5 6)
(13 14 7)
 7 6 5 2
其中,9这个节点既可从5到达,也可从6到达,我们只需计算最小从5到达的路径和即可

计算最后一行

    (2)
   (5 6)
 (13 14 7)
(20 19 12 9)

通过取最后一行的最小值,即可获取最小路径和:9

题解

思路清晰之后直接上代码:

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        for coloumIndex,row in enumerate(triangle):
            if coloumIndex>0:
                # 最左边元素仅可从上一行的最左边元素到达
                row[0] += triangle[coloumIndex-1][0]
                # 最右边元素仅可从上一行最右边元素到达
                row[-1] += triangle[coloumIndex-1][-1]
                # 其余元素可从上一行的2个元素到达,取最小计算路径和
                for i in range(1,coloumIndex):
                    row[i]+=min(triangle[coloumIndex-1][i-1],triangle[coloumIndex-1][i])
        # 返回最后一行中最小的路径和
        return min(triangle[-1])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值