代码随想录刷题第32天|122.买卖股票的最佳时机,55.跳跃游戏,45.跳跃游戏||

122.买卖股票的最佳时机||

局部最优:收集每天的正利润,全局最优:求得最大利润

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        result=0
        for i in range(1,len(prices)):
            result+=max(prices[i]-prices[i-1],0)#负数的不算

        return result

55.跳跃游戏

其实跳几步无所谓,关键在于可跳的覆盖范围

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

class Solution:
    def canJump(self, nums: List[int]) -> bool:
        cover=0
        if len(nums)==0:
            return True
        i=0
        while i<=cover:
            cover=max(i+nums[i],cover)#找到最大覆盖量
            if cover>=len(nums)-1:
                return True
            i+=1
        return False

45.跳跃游戏||

所以真正解题的时候,要从覆盖范围出发,不管怎么跳,覆盖范围内一定是可以跳到的,以最小的步数增加覆盖范围,覆盖范围一旦覆盖了终点,得到的就是最少步数!

这里需要统计两个覆盖范围,当前这一步的最大覆盖和下一步最大覆盖

这里还是有个特殊情况需要考虑,当移动下标达到了当前覆盖的最远距离下标时

  • 如果当前覆盖最远距离下标不是是集合终点,步数就加一,还需要继续走。
  • 如果当前覆盖最远距离下标就是是集合终点,步数不用加一,因为不能再往后走了。
  • class Solution:
        def jump(self, nums: List[int]) -> int:
            if len(nums)==1:
                return 0
            cur_distance=0#当前覆盖最远距离下标
            ans=0#记录走的最大步数
            next_distance=0#下一步覆盖的最远距离下标
            
            for i in range(len(nums)):
                next_distance=max(nums[i]+i,next_distance)#更新下一步最远距离下标
                if i==cur_distance:#遇到当前覆盖最远距离下标
                    ans+=1#需要走下一步
                    cur_distance=next_distance#更新当前覆盖最远距离下标
                    if cur_distance>=len(nums)-1:
                        break
            return ans#每一片覆盖范围都取最远
    
    
    

    法二:其精髓在于控制移动下标 i 只移动到 nums.size() - 2 的位置,所以移动下标只要遇到当前覆盖最远距离的下标,直接步数加一,不用考虑别的了

  • class Solution:
        def jump(self, nums: List[int]) -> int:
            
            cur_distance=0#当前覆盖最远距离下标
            ans=0#记录走的最大步数
            next_distance=0#下一步覆盖的最远距离下标
            
            for i in range(len(nums)-1):
                next_distance=max(nums[i]+i,next_distance)
                if i==cur_distance:
                    cur_distance=next_distance
                    ans+=1
    
            return ans
    
    
    

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值