从零刷算法-跳跃游戏 II

189 阅读1分钟

「这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战」。

题目描述

给你一个非负整数数组 nums ,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一个位置。

假设你总是可以到达数组的最后一个位置。

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000

题目链接:跳跃游戏 II

思路介绍

max变量记录遍历到当前位置能跳到最远的位置;left,right为当前步骤能跳到的范围,遍历当前步骤的范围,寻找下一步的最大位置;step遍历统计步骤 第一步,left = 0, right = 0,只能从位置0开始,找到能跳到的最大位置max 第二步,left = 1, right = max, 遍历left到right范围内的元素,找到能跳到的最大位置max 第三步,left = right + 1, right = max,遍历left到right范围内的元素,找到能跳到的最大位置max 第四步,依此类推…… 当最大位置max到达最后一个位置或超出最后一个位置,终止遍历,返回step 注意:每次的左边界left不更新为right+1也没问题,不影响答案,只是做了重复计算,影响时间效率。

代码


class Solution {
    public int jump(int[] nums) {
        int max = 0;
        int left = 0, right = 0;
        int step = 0;
         while(right <= max){
            if(right >= nums.length - 1) return step;//最右边界超过边界,返回最小步骤
            // 遍历当前步骤的范围,更新能跳到的最大位置
            for(int i = left; i <= right; i++){
                max = Math.max(max, i + nums[i]);
            }
            step++;//步骤加1
            left = right + 1;// 更新左边界,不更新为right+1,从0开始也可,就是会导致重复计算
            right = max;// 更新右边界
        }
        return -1;//跳不到最后位置
    }
}

运行结果

执行结果:通过

执行用时:1 ms,

内存消耗:42 MB