代码随想录刷题营Day32(122:买卖股票的最佳时机2,55:跳跃游戏,45:跳跃游戏2)

买卖股票的最佳时机:122

这个题目想到利润是可以分解的,用贪心就是很简单了。(但是我想不到)为什么利润能分解,光体会这个一个我还想了半天呢。
举个例子:
在这里插入图片描述
例如第二天到第四天:
明眼人一看就知道应该从第二天买入,第四天卖出。
10-1=9这是最大的利润。
但这个可以是分解的,第三天-第二天的是4,第四天到第三天是5。我们把利润分解为每天为单位的维度,而不是从第二天到第四天的维度去思考。
所以,可以将单个间隔天的利润算出来,当作是一个profit数组,然后,只统计正数即可。


跳跃游戏:55

一刷,觉得这个题,使用贪心还是很有巧思的,不要拘泥于看一步,而是关键在于跳的覆盖范围!只要确定了范围,那肯定可以跳回去的。这个问题就可以转化为,跳跃的范围到底可不可以覆盖终点呢?
借随想录的图一用:
在这里插入图片描述

不过即便明白这个道理,我也不太会写代码,拿着这个题的题解赏析一下吧。

class Solution:
    def canJump(self,nums):
        cover=0
        if len(nums)==1:
            return True
        i=0
        while(i<=cover):
            cover=max(i+nums[i],cover)
            if cover>=(len(nums)-1):
                return True
            i=i+1
        return False

注意cover是动态变化的,要记录cover的动态变化值。每次更新最大的cover值,就是可跳最大的范围。然后再判断跳的范围能不能覆盖终点。


跳跃游戏2:45

一刷,唉,觉得这个题目超级难,怎么才是中等难度。
本来以为能够在之前的基础上,适当的添加计数就可以,但是发现在自己想得简单了。不能按照“能走多远是多远”的思路了,这样没颁发统计中间的步数可以潜在的还能走多少步。所以需要记录curD。这个题还是继续要好好体会的,毕竟是45,还是挺重要的,思路要记住。

class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums)==1:
            return 0
        curD=0
        res=0
        nextD=0
        for i in range(len(nums)):
            nextD=max(nums[i]+i,nextD)
            if i==curD:
                if curD!=len(nums)-1:
                    res=res+1
                    curD=nextD
                    if nextD>=len(nums)-1:
                        break
                else:
                    break
        return res

curD是当前覆盖的最远距离下标
res是记录走的最大步数
nextD是下一步覆盖的最远距离下标
然后进入for循环,nextD确定的是当前i的覆盖范围


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值