LeetCode算法题之120. Triangle(Medium)【Python3题解】

该博客解析了LeetCode中的120题,三角形最小路径和问题。通过动态规划方法,定义dp表格记录每个位置的最小路径和,从而找到从顶部到底部的最小路径总和。博主提供了详细的解题思路及Python3代码实现,并展示了运行时间和内存占用情况。

题目描述:
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

For example, given the following triangle

在这里插入图片描述

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

Note:

Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

题目大意:

  • 扒去题目外部的唬人的外衣,就是给定你一个数组,如例子中的图片所示,然后题中给你规定了一种行进方式,就是每个位置你只能向下面和它挨着最近的那两个位置走,语言描述不太准确,直接看例子图片,就会明白了
  • 最后让你返回走到底,也就是最后一行时,最小的路径和

解题思路:

  • 首先声明,此题为动态规划标签下的题目,下面直接上动态规划解法
  • 第一步:dp table的定义是什么?因为题目中让你求最小路径和啊,那么如果你把到达每个位置的最小的路径和都写出来了,就是将那个dp table 填充好,那答案不就是最后一行中,最小的那个数吗
  • 故,dp table就定义为每个位置的最小路径和,即dp[row][column]代表第row行,第column列的那个位置上的最小路径和
  • 第二步:怎么将每个位置的dp table的值,按照一个规律推导出来呢?其实各位在纸上一写,就明白了,一般的位置的最小路径和,就等于那个位置的上一行,那个位置的列的相邻两个的dp table 最小值,加上那个位置的值,这里语言还是描述不准确,看代码,就明白了
  • 第三步:就是代码实现想法即可
  • 最后想说,其实这道题的话,如果你将dp table 的定义,定义准确了,基本推导和代码实现不是问题,还是常规填充dp table 即可

少废话,上代码:

class Solution:
    def minimumTotal(self, triangle):
        # 初始化一个dp table
        # 因为dp[row][column]代表第row行,第column列的那个位置的路径最小和
        # 所以直接用给定数组,复制一下,作为初始dp table
        dp = triangle.copy()

        # 最外层循环控制行数,直至最后将dp table填充完整
        # 直接从第一行开始就行,因为第零行只有一个数
        # 如果给定数组也只有一个数,那最小路径和就是它本身
        for row in range(1, len(triangle)):
            # 内层循环控制列数
            for column in range(len(triangle[row])):
                # 如果是每一行的第一个元素,那么到达它的位置的可能性就只有一种
                # 就是上一行的第一个元素,所以加上,填充即可
                if column == 0:
                    dp[row][column] = triangle[row][column] + dp[row-1][column]
                # 如果是每一行的最后一个元素,与第一个元素同理
                # 也只有一种可能
                elif column == len(triangle[row])-1:
                    dp[row][column] = triangle[row][column] + dp[row-1][-1]
                # 其他情况,按照题意要求,按照题中规则行进
                # 那每个位置dp table的值就是那个位置的上一行和
                # 那个位置的列的上面两个数的最小值加上此位置的给定数组值
                # 这也就是递推公式
                else:
                    dp[row][column] = triangle[row][column] + min(dp[row-1][column-1], dp[row-1][column])

        return min(dp[-1]) # 答案就是dp table的最后一行的最小值

运行时间和内存占用:

  • Runtime: 60 ms, faster than 71.17% of Python3 online submissions for Triangle.
  • Memory Usage: 14.8 MB, less than 6.67% of Python3 online submissions for Triangle.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值