5.2python leetcode 120

120Triangle

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

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

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.


题解:

依然是动态规划题。

记录到每一层的每一个位置所需要的最小步数,层层遍历下去即可。其具体公式如下。

对于每一层,不为0和最后1个的那一步i和当前层level,其计算方式为。

step[level][i] = min( step[level-1][i-1] + triangle[level][i], step[level-1][i] + triangle[level][i])

当为第一个时,那么只有从上一层的0到达,最后一个时,同理。


当然题目说如果能用O(n)的空间是最好的。因此又使用了一个滚动数组。

具体做法是开2个数组。分别表示到达这一层和上一层的最小步数,代码如图。

step = [[999999 for i in range(len(triangle))], [999999 for i in range(len(triangle))]]

而状态判定也需要修改一下,改为使用index判断而不是level。index用level % 2来维护。index-1所对应的便是到达上一层的最小步数。

对于不是最后一个和不是第一个的元素i,修改如下

step[index][i] = min(step[index - 1][i - 1] + triangle[level][i], step[index - 1][i] + triangle[level][i])


代码如下

class Solution(object):
    def minimumTotal(self, triangle):
        if len(triangle) == 0:
            return 0
        
        if len(triangle) == 1:
            return triangle[0][0]
        
        step = [[999999 for i in range(len(triangle))], [999999 for i in range(len(triangle))]]
        level = 1
        step[0][0] = triangle[0][0]

        while level < len(triangle):
            index = level % 2

            i = 0
            while i < len(triangle[level]):
                if i > 0 and i < len(triangle[level]) - 1:
                    step[index][i] = min(step[index - 1][i - 1] + triangle[level][i],
                                         step[index - 1][i] + triangle[level][i])
                    # tmplist[i] = min(step[i] + triangle[level][i] , step[i-1] +  triangle[level][i])
                else:
                    if i == 0:
                        step[index][i] = step[index - 1][i] + triangle[level][i]
                    else:
                        step[index][i] = step[index - 1][i - 1] + triangle[level][i]

                i = i + 1

            level = level + 1

        return min(step[index])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 题目"leetcode 120 python"可能是指LeetCode上的第120题,使用Python语言解决。根据提供的引用内容,可以看出这是一个动态规划问题,需要找到一个三角形中的最小路径和。其中引用\[1\]和引用\[2\]提供了两种解决方案,都是使用动态规划的思想来解决。引用\[1\]中的解决方案使用了一个dp数组来保存每一层的最小路径和,然后通过遍历每一层的元素来更新dp数组。引用\[2\]中的解决方案也是使用了动态规划的思想,但是直接在原始的三角形数组上进行操作,通过不断更新每个元素的值来得到最小路径和。另外,引用\[3\]提供了另一个类似的问题的解决方案,也是使用了贪婪算法来求解最小路径和。综上所述,可以根据这些引用内容来解决LeetCode上的第120题。 #### 引用[.reference_title] - *1* [LeetCode120. 三角形最小路径和(python)](https://blog.csdn.net/rosefun96/article/details/108690841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [LeetCode120/931. 下降路径问题(python)](https://blog.csdn.net/qq_43235359/article/details/88907301)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值