【Leetcode每日一刷】贪心算法| 45.跳跃游戏 II

1、45.跳跃游戏 II

🦄解题思路:

这题还是比【55.跳跃游戏】难一些的。第一个版本只是说,求跳跃的范围,覆盖到了终点即可。这题则是,能保证覆盖范围到达终点,求的是最少跳几次,跳到终点。

这题的话也是偏直觉,最好能一步到就好,一步到不了,两步能到吗?两步还到不了,三步呢?听起来是不是还挺简单的?但是实现起来,还是有一些需要考虑的。

❌错误代码和分析1:

cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int cover_now = 0;//当前元素所能cover的最远范围
        int cover_next_max = 0;//如果多跳一步,下一步将cover的最远范围
        int cnt = 0;//跳跃步数
        if(nums.size() == 1) return 0;
        for (int i = 0; i <= cover_next_max; i++){
            cover_now = i + nums[i];
            if(cover_now >= nums.size()-1){
                return ++cnt;
            }
            cover_next_max = max(cover_next_max, cover_now);
            ++cnt;
        }
        return cnt;
    }
};

明白了大致思路,但是实现起来还是有问题,我们再来捋一下思路。

  • 首先要明白什么是now_cover:这个now指的是当前跳了cnt步,最远的覆盖范围!
  • 什么是next_cover_max:在现在cnt的基础上+1,也就是多跳一步(cnt++肯定就是已经确定,跳当前cnt步,肯定到不了终点),能到达的最远范围。
  • 而我们也知道,从当前位置,可以有多种跳跃选择,都是算再跳一步,那么怎么选择,才能让跳跃这一步,能在跳到的新位置能直接跳到终点或能跳的更远;这就是我们要求的下一步的最远距离:再跳一次,可以覆盖的最远范围:next_cover_max
  • 而什么时候需要跳呢,也就是说,当当前遍历位置,达到now_cover了,也就是说,跳当前的cnt步,无论如何都到达不了终点;那么这个时候cnt++说明需要多跳一步,跳的一个新位置,看看能不能从这个新位置到达终点。

    ✅正确代码:
cpp 复制代码
class Solution {
public:
    int jump(vector<int>& nums) {
        int cover_now = 0;//当前元素所能cover的最远范围
        int cover_next_max = 0;//如果多跳一步,下一步将cover的最远范围
        int cnt = 0;//跳跃步数
        if(nums.size() == 1) return 0;
        for (int i = 0; i <= nums.size()-1; i++){
            cover_next_max = max(cover_next_max, i + nums[i]); //更新多跳一步,从新位置可以到达的最远范围
            if(cover_next_max >= nums.size()-1) return ++cnt; //若可以到达,说明的确只需要跳一步就到达终点,返回当前cnt++即可
            if(i == cover_now){ //说明跳当前cnt步,无论如何都到不了终点
                cnt ++; //必须至少多跳一步
                cover_now = cover_next_max;  //更新当前cnt所能覆盖的最远范围
            }
        }
        return cnt;
    }
};
相关推荐
慢慢向上的蜗牛3 分钟前
Atlas300I推理卡驱动适配Linux 6.12+内核
linux·c++·人工智能·华为·驱动·底层开发·ascend
50万马克的面包3 分钟前
C语言第3讲:分支和循环
c语言·开发语言·笔记·算法
码农小韩8 分钟前
QT学习记录(三)——C++学习基础(三)
开发语言·c++·qt·学习·算法·嵌入式软件
承渊政道12 分钟前
【动态规划算法】(似包非包以及卡特兰数问题深入解析)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法
fangzt201021 分钟前
从零搭建自动驾驶中间件(四):数据录制与回灌——算法调试的核心基础设施
算法·中间件·自动驾驶
楼田莉子23 分钟前
仿Muduo的高并发服务器:基于Tcp协议的回显服务器
linux·服务器·c++·后端
人道领域23 分钟前
【LeetCode刷题日记】二叉树层序遍历完全指南:从基础到LeetCode实战一篇搞定BFS模板,秒杀4道经典面试题
java·开发语言·数据结构·leetcode·面试·二叉树
搬砖的小码农_Sky29 分钟前
比特币区块链:SHA256哈希函数
算法·区块链·哈希算法
CSCN新手听安37 分钟前
【Qt】系统相关(二)鼠标事件的处理,鼠标的按下,释放,双击,移动,滚轮滚动事件的处理
开发语言·c++·qt
承渊政道38 分钟前
【动态规划算法】(一文讲透二维费用的背包问题)
数据结构·c++·学习·算法·leetcode·动态规划·哈希算法