贪心算法|55.跳跃游戏

力扣题目链接

cpp 复制代码
class Solution {
public:
    bool canJump(vector<int>& nums) {
        int cover = 0;
        if (nums.size() == 1) return true; // 只有一个元素,就是能达到
        for (int i = 0; i <= cover; i++) { // 注意这里是小于等于cover
            cover = max(i + nums[i], cover);
            if (cover >= nums.size() - 1) return true; // 说明可以覆盖到终点了
        }
        return false;
    }
};

思路

刚看到本题一开始可能想:当前位置元素如果是 3,我究竟是跳一步呢,还是两步呢,还是三步呢,究竟跳几步才是最优呢?

其实跳几步无所谓,关键在于可跳的覆盖范围!

不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。

这个范围内,别管是怎么跳的,反正一定可以跳过来。

那么这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!

每次移动取最大跳跃步数(得到最大的覆盖范围),每移动一个单位,就更新最大覆盖范围。

贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点

局部最优推出全局最优,找不出反例,试试贪心!

如图:

i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。

而 cover 每次只取 max(该元素数值补充后的范围, cover 本身范围)。

如果 cover 大于等于了终点下标,直接 return true 就可以了。

代码随想录 (programmercarl.com)

自己的思路

刚看代码时,没怎么看懂。

关键在于cover

复制代码
for (int i = 0; i <= cover; i++)

在cover里面一个一个遍历,是否可以到达最后一个元素

啊,这个思路真的太巧妙了,代码也如此简洁

相关推荐
XiYang-DING7 分钟前
【LeetCode】Hash | 136.只出现一次的数字
算法·leetcode·哈希算法
wayz1110 分钟前
Day 3:逻辑回归与分类预测
算法·分类·逻辑回归
tankeven17 分钟前
HJ176 【模板】滑动窗口
c++·算法
网域小星球1 小时前
C 语言从 0 入门(十二)|指针与数组:数组名本质、指针遍历数组
c语言·算法·指针·数组·指针遍历数组
冰糖拌面1 小时前
二叉树遍历-递归、迭代、Morris
算法
碧海银沙音频科技研究院2 小时前
虚拟机ubuntu与windows共享文件夹(Samba共享)解决WSL加载SI工程满卡问题
人工智能·深度学习·算法
CoovallyAIHub2 小时前
ICLR 2026 | VLM自己学会调检测器:VTool-R1用强化学习教视觉模型使用工具推理
算法·架构·github
CoovallyAIHub2 小时前
RK3588上111 FPS:轻量YOLOv8+异步视频处理系统实现无人机自主电力巡检
算法·架构·github
炽烈小老头2 小时前
【每天学习一点算法 2026/04/13】两数相除
学习·算法
嘻嘻哈哈樱桃2 小时前
俄罗斯套娃信封问题力扣--354
算法·leetcode·职场和发展