LeetCode 45. 跳跃游戏 II 题解

引言

在LeetCode的算法题库中,"跳跃游戏 II"是一个经典的贪心算法问题。这个问题不仅考验了我们对数组操作的理解,还锻炼了我们如何利用贪心策略来优化问题求解。本文将详细解析这个问题,并提供Java语言的解决方案。

问题描述

给定一个非负整数数组 nums,你最初位于数组的第 0 个位置。每次你可以从位置 i 跳跃到 ji ≤ j),满足 j ≤ nums[i] + i。你的目标是使用最少的跳跃次数到达数组的最后一个位置,并返回所需的最少跳跃次数。

输入输出格式

  • 输入:一个非负整数数组 nums
  • 输出:一个整数,表示到达数组末尾所需的最少跳跃次数。

算法思路

  1. 贪心选择:在每一步中,选择能够跳得最远的位置作为下一次跳跃的起点。
  2. 维护两个指针end 表示当前能够到达的最远位置,maxPosition 表示下一次跳跃能够到达的最远位置。
  3. 遍历数组 :从左到右遍历数组,更新 maxPosition 为当前位置加上可以跳的步数的最大值。
  4. 更新跳跃次数 :当遍历到 end 时,增加跳跃次数并将 end 更新为 maxPosition
  5. 终止条件 :如果 end 超过了数组的最后一个位置,说明已经到达终点,返回当前的跳跃次数。

Java 代码实现

java 复制代码
public class Solution {
    public int jump(int[] nums) {
        int n = nums.length;
        if (n < 2) return 0; // 如果数组长度小于2,无需跳跃
        int end = 0, maxPosition = 0, step = 0; // 初始化指针和步数
        for (int i = 0; i < n - 1; i++) {
            maxPosition = Math.max(maxPosition, i + nums[i]); // 更新最远能跳到的位置
            if (i == end) { // 如果当前位置是end,更新end并增加步数
                end = maxPosition;
                step++;
            }
        }
        return step; // 返回所需的最少步数
    }
}

复杂度分析

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们只需要遍历一次数组。
  • 空间复杂度:O(1),除了输入数组外,我们只需要常数级别的额外空间。

总结

"跳跃游戏 II" 是一个典型的贪心算法问题,通过合理选择每一步的跳跃点,可以有效地减少跳跃次数。在实际编程中,贪心算法通常用于解决优化问题,它简单且高效。然而,贪心算法并不总是能得到全局最优解,需要根据问题的具体场景来判断是否适用。

希望这篇文章能帮助你更好地理解贪心算法,并在解决类似问题时能够灵活运用。


相关推荐
pwn蒸鱼4 分钟前
leetcode:92. 反转链表 II
算法·leetcode·链表
深念Y7 分钟前
Harness Engineering:我的HomeSense Agent 架构演进
人工智能·算法·架构·智能家居·agent·小爱同学·harness
Imxyk10 分钟前
P9244 [蓝桥杯 2023 省 B] 子串简写
数据结构·c++·算法
colus_SEU11 分钟前
SVM 面试题总结
算法·机器学习·支持向量机
INGNIGHT12 分钟前
373. 查找和最小的 k 对数字(堆priority_queue)
算法
ambition2024216 分钟前
深度优先搜索(DFS)与回溯算法详解:以全排列问题为例
算法·深度优先
Omics Pro16 分钟前
马普所:生命蛋白质宇宙聚类
数据库·人工智能·算法·机器学习·数据挖掘·aigc·聚类
汀、人工智能17 分钟前
[特殊字符] 第106课:旋转图像
数据结构·算法·矩阵·数据库架构·数组·旋转图像
ulias21221 分钟前
leetcode热题 - 2
算法·leetcode·职场和发展
Ivanqhz22 分钟前
SMT(Satisfiability Modulo Theories,基于模理论的可满足性)
人工智能·算法·机器学习