45. Jump Game II蹦蹦游戏II Python&Java

给定一个非负整数数组,您最初位于该数组的第一个索引处。数组中的每个元素代表该位置的最大跳转长度。目标是在最少的跳数中达到最后的索引。

Input:[2,3,1,1,4]

Output:2 (第一步从2到3, 然后从3到4)

Clue: 其实就每次选择当前数值A的后A位最大值B的位置, 然后以以B为标准重复选择后面B个数的最大值直到最后。

class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums) <= 1: return 0
        max_pos, max_steps, res = nums[0], nums[0], 1
        for i in range(1, len(nums)):     #从第2个数开始遍历
            if max_steps < i:     #
                res += 1    #向前蹦了一次
                max_steps = max_pos        #已经蹦到最大的那个数的位置
            max_pos = max(max_pos, nums[i] + i)     #定位下一次蹦位置
        return res

Java

class Solution {
    public int jump(int[] nums) {
        if (nums.length < 2) {
            return 0;
        }
        int maxPos = nums[0], maxStep = nums[0], res = 1;
        for (int i=1; i < nums.length;i++) {
            if (maxStep < i) {//能向前走的最大步子
                res++;
                maxStep = maxPos;
            }
            maxPos = Math.max(nums[i] + i, maxPos);
        }
        return res;
    }
}

时间复杂度O(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值