当前位置: 首页 > article >正文

【动态规划-矩阵】4.三角形最小路径和

题目

难度: 中等
题目内容:
给定一个三角形 triangle ,找出自顶向下的最小路径和。

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

前置思路

题设中已经给出提示,前一行某一个位置只能下移到下一行i或i+1的位置,反过来,某一行的位置只能从上一行i或i-1的位置移动过来,那么移动到该位置的最小路径为两者小值+本位置的路径值。
然后最后一行取最小值即可。

代码

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        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[-1])

大神解

class Solution:
    def minimumTotal(self, triangle: List[List[int]]) -> int:
        n = len(triangle)
        dp = [[0] * (i+1) for i in range(n)]
        dp[-1] = triangle[-1]
        for i in range(n-2, -1, -1):
            for j, x in enumerate(triangle[i]):
                dp[i][j] = min(dp[i+1][j], dp[i+1][j+1]) + x
        return dp[0][0]

这里我一开始没想到,如果倒着走可以省去最后一步求最小值的计算。
从倒数第二层开始遍历,可以预知到每一个位置会选择的下一个位置,这样一步步往上做筛选,最终会得到唯一的最小值。

思考

这一题的优化方案提供了一个很好的思路——路径是可逆的,如果遇到类似的问题可以多一种思考的方式,代码走向尽量去往更简单的结果。


http://www.kler.cn/a/503951.html

相关文章:

  • 【Vue】mouted、created、computed区别
  • 小结:华为路由器常用的操作指令
  • 【TI毫米波雷达】DCA1000不使用mmWave Studio的数据采集方法,以及自动化实时数据采集
  • OceanBase数据库设计与管理:构建高效分布式数据架构基石
  • 持续交付的利器:Blue Ocean与Pipeline
  • 32单片机从入门到精通之安全性与可靠性——防护措施(十八)
  • dockerfile2.0
  • 61_Redis服务器端优化
  • Android 中mk文件语法浅析
  • 鸿蒙打包发布
  • Windows CMD 常用命令
  • Docker Compose 教程
  • 【论文笔记】SmileSplat:稀疏视角+pose-free+泛化
  • 【专题】2025年节日营销趋势洞察报告汇总PDF洞察(附原数据表)
  • Idea+docker通过dockerFile方式往华为云发布项目
  • 主流消息队列(MQ)对比分析
  • ros2笔记-7.1 机器人导航介绍
  • ISP各模块功能介绍
  • 【Vue】let、const、var的区别、适用场景
  • Java中网络编程的学习
  • 深度解析 pytest 参数化与 --count 执行顺序的奥秘
  • 零碎的知识点(七):线性二次调节器(LQR)是什么?
  • IIS安全配置基线
  • 自动连接校园网wifi脚本实践(自动网页认证)
  • 水下通信:特点、主要应用与典型系统
  • 数据仓库基础常见面试题