递归与动态规划---跳跃游戏

【题目】

  给定数组arr,arr[i] == k代表可以从位置i向右跳1~k个距离。比如,arr[2] == 3,代表从位置2可以跳到位置3、位置4或者位置5。如果从位置0出发,返回最少跳几次能跳到arr最后的位置上。

【举例】

  arr = [3, 2, 3, 1, 1, 4]
  arr[0] = 3,选择跳到位置2;arr[2] == 3,可以跳到最后的位置,所以返回2。

【基本思路】

 1.使用3个变量,jump,cur,next。jump表示目前跳了多少次,cur表示跳了jump下后能到达的最远距离,next表示如果再跳一次能到达的最远位置。初始时三个变量都为0。

 2.从左到右依次遍历数组arr,假设遍历到位置i,分析如下:

  • 如果i <= cur,说明跳jump次可以到达位置i,此时不需要进行任何操作。

  • 如果i > cur,说明此时跳jump次不能到达位置i,需要再跳一次才行。此时令jump + 1,cur = next。表示多跳了一次,cur更新成跳jump + 1次能到达的最远距离。

  • 更新next,next = max(next, i + arr[i]),表示下一次多跳一次能到达的最远距离。

下面是使用python3.5实现的代码。

#跳跃游戏
def jump(arr):
    if arr == None or len(arr) == 0:
        return 0
    jump = 0
    cur = 0
    next = 0
    for i in range(len(arr)):
        if cur < i:
            jump += 1
            cur = next
        next = max(i+arr[i], next)
    return jump
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值