算法日常・每日刷题--<贪心>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;
    }
};
相关推荐
UIU11421 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
论文复现现场21 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi21 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
秋天的怀念_David1 天前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
碧海银沙音频科技研究院1 天前
在PC电脑上用Whisper→Marian算法实现离线语音翻译功能
算法·whisper
niyongsheng1 天前
3D 装箱算法工程化:数据结构、放置启发式与支撑规则
数据结构·算法·rust
j7~1 天前
【穷举、深搜与回溯算法】一棵决策树讲透全排列与子集
数据结构·c++·算法·leetcode·回溯·递归
傅科摆 _ py1 天前
DP,贪心,堆和栈,二分力扣复习
开发语言·python·算法
Shaoshing1 天前
LeetCode100 42.接雨水
java·算法·leetcode
域限奇点访客1 天前
用AI生成问卷的网站怎么选?看题目录入结构、题型映射和生成后的校验
算法