Leetcode 贪心算法 45.跳跃游戏II

题⽬地址:https://leetcode-cn.com/problems/jump-game-ii/
给定⼀个⾮负整数数组,你最初位于数组的第⼀个位置。
数组中的每个元素代表你在该位置可以跳跃的最⼤⻓度。
你的⽬标是使⽤最少的跳跃次数到达数组的最后⼀个位置。
示例:
输⼊: [2,3,1,1,4]
输出: 2
解释: 跳到最后⼀个位置的最⼩跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最
后⼀个位置。
说明:
假设你总是可以到达数组的最后⼀个位置
想法:寻找最大的一个点,找到以后往前继续找区间里最大的一个点:
例如:2,3,1,1,4
最大点2长度为3,找到以后只需找2前面的点的最大值就可以
但是这个有局限性
因此还是考虑上一把的覆盖范围
class Solution:
def jump(self, nums: List[int]) -> int:
count=0
sum=0
for i in range(0,len(nums)-1):
sum=nums[i]+i
count=count+1
if sum>=len(nums)-1:
break
return count
这里明显遇到了一个极端,例如:
[1,2,1,1,1],这种情况只会1个1个走

思路2:不断判断最大覆盖范围,到终点时获得最小步数:
class Solution:
def jump(self, nums: List[int]) -> int:
count=0
sum=0
max=-1
for i in range(0,len(nums)-1):
if nums[i]==0:
break
else:
sum=nums[i]+i
if max<sum:
max=sum
count=count+1
if max>=len(nums)-1:
count=count+1
break
return count
失败
思路3:
判断当前的最大范围和下一步最大范围,如果下一步最大范围到达终点则走一步,若i已到当前最大范围则必须走一步扩大下一步最大范围

假设第一步,我们刚刚要往数组的第一格走,因为我们站在数组外面,所以当前能取得最远距离是0(但我们肯定得走,只有第一步跟最远距离没啥关系,因为必须要走),步数走了一,下一步覆盖距离则是第一格的距离,当前我们正好遇到了最远距离的下标,所以必须走下一步,而走的下一步正好更新了最远距离
然后每走一步更新一次。

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

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值