跳跃游戏—贪心算法

题目描述:

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

解题思路:

注意,很容易陷入的误区是我怎么跳,但其实,怎么跳无所谓,只要所在位置的可跳的最大覆盖范围能达到最后一个位置下标即可满足要求。

贪心算法的解题思路为先求局部最优,以求得的局部最优为前提求整体最优。

显然,每次跳跃的最优为解为该位置的最大覆盖范围即cover—max=location+skip_step,整体最优解为局部最优的最大值,当整体最优能满足覆盖范围为整个数组时,返回True,反之,返回False。

代码实现:

class Solution(object):
    def canJump(self, nums):
        """
        :type nums: List[int]
        :rtype: bool
        """
        if len(nums)==1:return True
        i=0
        cover = 0
        while i <= cover:    ###表示在覆盖范围内跳跃,更新最大覆盖值
            cover = max(i+nums[i], cover)
            if cover >= len(nums)-1:return True
            i+=1
        return False

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值