力扣刷题笔记 → 45. 跳跃游戏 II

169 阅读1分钟

这是我参与11月更文挑战的第23天,活动详情查看:2021最后一次更文挑战

题目

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

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

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

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

示例

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

提示

  • 1 <= nums.length <= 10^4
  • 0 <= nums[i] <= 1000

解题思路

贪心

在数组中,我们每次移动,在当前位置都有一个值对应着其可以跳跃的长度。长度有长有短,在假设我们必定能够到达最后一个位置的条件下,我们需要做的就是遍历每一位元素,不断刷新最长边界,争取使用最少的次数跳跃到目标位置。

我们可以维护一个当前能够抵达的最长边界下标位置,当移动到该位置时,次数+1

在移动的过程成,我们需要不断更新最长边界下标,这样才可以得出单次跳跃范围内可达最远边界。

class Solution {
    public int jump(int[] nums) {
        int n = nums.length, end = 0, max = 0, step = 0;
        for(int i = 0; i < n - 1; ++i){
            // 更新单次跳跃可达最远边界下标
            max = Math.max(max, i + nums[i]);
            // 判断是否达到最远边界下标位置
            if(i == end){
                // 更新下次最远边界坐标值
                end = max;
                // 次数 +1
                ++step;
            }
        }
        
        // 返回结果
        return step;
    }
}

 复杂度分析

  •   时间复杂度:O(N)O(N)
  •   空间复杂度:O(1)O(1)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/ju…