算法日常・每日刷题--<贪心>17

45. 跳跃游戏 II - 力扣(LeetCode)45. 跳跃游戏 II - 给定一个长度为 n 的 0 索引整数数组 nums。初始位置在下标 0。每个元素 numsi 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处: * 0 <= j <= numsi 且 * i + j < n返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 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 <= numsi <= 1000 * 题目保证可以到达 n - 1https://leetcode.cn/problems/jump-game-ii/submissions/750293523/

题目描述

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

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

核心思路

这道题的贪心思路本质上等价于BFS 层序遍历: 把每一次跳跃看作一层。

  • 在当前一层覆盖的区间内,不断更新能跳到的最远下标
  • 当遍历走到当前层的边界时,代表这一层已经全部探索完毕,必须进行一次跳跃,更新下一层的边界
  • 一旦边界覆盖到数组末尾,直接结束,得到最小步数

贪心选择:在当前能到达的区间里,尽可能找到跳得最远的位置,从而减少总跳跃次数。

为什么贪心可以得到最小步数? 要步数最少,每一跳就要最大化覆盖范围,这是局部最优推出全局最优。

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int n=nums.size();
        if(n==1)
        return 0;
        int step = 0;
        int end = 0;      
        int maxReach = 0;
        for(int i=0;i<n;i++){
            maxReach=max(maxReach,i+nums[i]);
            if(i == end)
            {
                step++;
                end = maxReach;
                if(end >= n-1) break;
            }
        }
        return step;
    }
};
相关推荐
6Hzlia3 小时前
【Classic 150 刷题计划】 LeetCode 205. 同构字符串 | C++ 双向绑定与哈希表映射
c++·算法·leetcode
有点。10 小时前
C++03阶段练习(练习题)
数据结构·算法·图论
周末也要写八哥11 小时前
经典算法实例:游戏中弱角色的数量(二)
算法
是Yu欸11 小时前
鸿蒙PC移植:2048 从网页小游戏到 AI 桌面应用
大数据·人工智能·算法·数据挖掘·openharmony·codex
鹿角片ljp12 小时前
KV Cache 解析
java·算法
liliangcsdn12 小时前
IVOL与偏度因子的对比测量分析
算法
threerocks13 小时前
Jev 入门第一课
算法
西柚研究生12345614 小时前
论文分析17:YOLOv11_UAVNet:无人机航拍图像专用目标检测算法
人工智能·python·深度学习·算法·目标检测
hetao173383715 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法