45.跳跃游戏Ⅱ

题目描述

题目描述

题解一(贪心算法)(正向查找可到达的最大位置)(最优解)

思路

正向查找思路

代码

java 复制代码
class Solution {
    public int jump(int[] nums) {
        // 如果数组长度只有1,说明已经在终点,不需要跳跃
        if (nums.length <= 1) return 0;
        
        int jumps = 0;        // 记录跳跃次数
        int currentEnd = 0;   // 当前这一跳能到达的最远边界
        int farthest = 0;     // 在当前边界内,下一步能到达的最远极限
        
        // 注意:这里遍历到 nums.length - 2 即可 (即 i < nums.length - 1)
        // 因为如果当前边界 currentEnd 已经覆盖了最后一个元素,就不需要再起跳了
        for (int i = 0; i < nums.length - 1; i++) {
            // 沿途更新下一步能到达的最远距离
            farthest = Math.max(farthest, i + nums[i]);
            
            // 如果走到了当前这一跳的边界,说明必须进行下一次跳跃了
            if (i == currentEnd) {
                jumps++;              // 跳跃次数 +1
                currentEnd = farthest; // 更新下一次跳跃的边界
                
                // 优化:如果新的边界已经到达或超过终点,直接结束
                if (currentEnd >= nums.length - 1) {
                    break;
                }
            }
        }
        
        return jumps;
    }
}

复杂度分析

  • 时间复杂度:O(N)O(N)O(N)。其中 NNN 是数组 nums 的长度
  • 空间复杂度:O(1)O(1)O(1)。整个算法执行过程中,我们仅仅声明了三个整型变量(jumps、currentEnd、farthest)来记录状态。无论输入的数组 nums 有多长,我们所需的额外内存空间都是固定不变的

题解二(贪心算法)(反向查找出发位置)

思路

反向查找思路

代码

java 复制代码
class Solution {
    public int jump(int[] nums) {
        int position = nums.length - 1; // 当前需要到达的目标位置,初始为终点
        int steps = 0;                  // 记录跳跃次数
        
        // 当目标位置还没退回到起点 0 时,继续反向查找
        while (position > 0) {
            // 从左向右遍历,寻找能到达当前 position 的最左侧(最早)位置
            for (int i = 0; i < position; i++) {
                if (i + nums[i] >= position) {
                    position = i; // 更新目标位置为这个起跳点
                    steps++;      // 跳跃次数 +1
                    break;        // 已经找到了最左侧的,跳出 for 循环,开始新一轮的 while 寻找
                }
            }
        }
        
        return steps;
    }
}

复杂度分析

  • 时间复杂度: O(N2)O(N^2)O(N2)。在最坏的情况下(例如数组是 1, 1, 1, 1, 1),我们每次都只能往左退一步。为了退这一步,for 循环要从 0 遍历到 position - 1。总的遍历次数大约是 (N−1)+(N−2)+⋯+1(N-1) + (N-2) + \dots + 1(N−1)+(N−2)+⋯+1,属于 O(N2)O(N^2)O(N2) 级别
  • 空间复杂度: O(1)O(1)O(1)。只使用了几个常数级别的额外变量
相关推荐
David猪大卫14 分钟前
【C++修炼】STL容器—stack与queue
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
瑶池酒剑仙15 分钟前
C++变量初始化五法完全指南:默认/拷贝/直接/列表/值初始化与窄化转换陷阱(青云之志)
c语言·开发语言·数据结构·c++·算法·visual studio
用户2380030994518 分钟前
从零开始实现扫雷游戏(C 语言控制台版)
算法
国科安芯44 分钟前
星上计算的第一道防线:低轨遥感卫星载荷处理链中的AS32S601型抗辐射MCU—— 面向高分辨率成像与在轨智能处理的场景化综述
大数据·网络·人工智能·单片机·算法·低轨卫星·抗辐射
thusloop1 小时前
零门槛接入 GPT-6-astra 与 claude-opus-5-5,三大场景实战指南
python·gpt·算法·agent·claude·codex
瓦瓦gogo1 小时前
学回溯算法时,我先弄明白了怎么“退回来”
算法
Lzg_na2 小时前
堆和堆排序
算法
TK泰妞2 小时前
TikTok 带货视频如何做多语言本地化?从翻译脚本到重做场景的实用方法
算法·音视频
房开民2 小时前
DDPM 完整原理 + 全套公式串联
算法
lunar_coder2 小时前
哈希扩展 -- 位图思想
c++·算法·哈希算法