首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >[Java·算法·中等] LeetCode 45. 跳跃游戏 II 详细解读

[Java·算法·中等] LeetCode 45. 跳跃游戏 II 详细解读

作者头像
人不走空
发布2024-02-20 19:18:06
发布2024-02-20 19:18:06
5960
举报
文章被收录于专栏:学习与分享学习与分享

题目

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。

示例

示例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
  • 题目保证可以到达 nums[n-1]

👉️ 力扣原文

代码语言:javascript
复制
class Solution {
    public int jump(int[] nums) {
        int jumps = 0;
        int currentEnd = 0;
        int farthest = 0;

        for(int i = 0;i < nums.length - 1; i++){
            farthest = Math.max(farthest,i + nums[i]);
            if(i == currentEnd){
                jumps++;
                currentEnd = farthest;
            }
        }

        return jumps;
    }
}

详细解读

这是一个经典的贪心算法问题。你可以使用贪心算法来找到到达数组的最后一个元素的最小跳跃次数。

这个算法的核心思想是维护两个指针 currentEndfarthest,分别表示当前跳跃范围的结束位置和在这个范围内可达的最远位置。遍历数组时,不断更新 farthest,表示在当前范围内可以跳得更远。

当遍历到 i == currentEnd 时,表示需要进行下一次跳跃,此时将 jumps 增加1,同时将 currentEnd 更新为 farthest,表示下一次跳跃的范围。

最终,当遍历完整个数组后,jumps 就表示到达数组最后一个元素的最小跳跃次数。

这个算法具有线性时间复杂度 O(n),其中 n 是数组的长度,因为只需一次遍历数组。它是一种高效的解决方案用于解决跳跃游戏问题。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-05,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 题目
  • 示例
    • 示例1
      • 示例2
  • 提示
  • 详细解读
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档