当前位置: 首页 > news >正文

跳跃游戏两则

跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

思路

这里只要求判断可达,所以并不需要思考具体的跳动步骤,主要是看覆盖范围

不一定非要明确一次究竟跳几步,每次取最大的跳跃步数,这个就是可以跳跃的覆盖范围。这个范围内,别管是怎么跳的,反正一定可以跳过来。

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 = max(i + nums[i], cover);
            if (cover >= nums.size() - 1) return true;
        }
        return false;
    }
};

跳跃游戏二则要求输出的是到达 nums[n - 1] 的最小跳跃次数。那么我们就要具体想一下这个跳跃的过程。利用贪心思想,当前可移动距离尽可能多走,如果还没到终点,步数再加一。

这里需要统计两个覆盖范围,当前这一步cur的最大覆盖和下一步next最大覆盖。具体来说就是,cur指的是当前位置覆盖最远距离下标,next指的是在当前位置跳到下一个某个位置后在该位置的最远覆盖下标。

举个例子,有nums = [2,3,1,1,4],初始我们在nums[0] = 2处,此时我们在该位置跳一次最远可以跳到nums[2],next更新为2。初始我们的cur也为0(cur == i),说明我们现在所在的位置是我们在上个位置能跳到的最远的下标,ans++,并更新cur = 2,意思是我们在目前位置i = 0处能跳到的最远下标为i = 2。

当我们枚举i = 1的位置时,我们计算出在i = 1这个地方能跳到的最远下标是4(num[1] + 1),但是我们现在还不在i = 1的位置,所以next = 4且不用更新cur。(也就是说,我们现在还在i = 0,当我们跳到下一个位置i = 1后,我们能最远再跳到下标4;不用更新是因为根据贪心策略我们想尽量跳得更远)。

当我们枚举i = 2的位置,前面操作同理,但是i = 2是我们在当前位置i = 0能跳到的最远位置,所以我们可以跳到该位置,然后更新cur = next。

class Solution {
public:
    int jump(vector<int>& nums) {
        if (nums.size() == 1) return 0;
        int cur = 0; // 当前覆盖最远距离下标
        int next = 0; // 到达当前位置时的下一个覆盖的最远下标
        int ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            next = max(i + nums[i], next);
            if (i == cur) {
                ans++;
                cur = next;
                if (next >= nums.size() - 1) break;
            }
        }
        return ans;
    }
};

相关文章:

  • Kubernetes控制平面组件:API Server详解(一)
  • 【STM32】使用电打火器测试火焰传感器,去掉传感器LED依然亮
  • 粉色和紫色渐变壁纸怎么设计?
  • StepAudio:语音大模型
  • IDEA配置JSP环境
  • 汽车开放系统架构(AUTOSAR)中运行时环境(RTE)生成过程剖析
  • salesforce 实现自定义多选列表
  • 【conda环境泄露】所有环境共享了一个包?
  • 拨开顺序表的层层迷雾
  • C++ 编程基础(8)模版 | 8.4、类型萃取
  • Pytorch实现之浑浊水下图像增强
  • 10. docker nginx官方镜像使用方法
  • Mybatis的一级、二级缓存
  • win32汇编环境,加速键的应用示例
  • C++模板与STL七日斩:从工业编程到高效数据管理(工业项目)
  • 纷析云:赋能企业财务数字化转型的开源解决方案
  • React 源码揭秘 | 更新队列
  • 28.C++多态1 (多态的概念与简单使用,虚函数,final,override)
  • linux--多进程开发(5)--进程
  • C/C++ | 每日一练 (4)
  • 新型基因编辑工具可精准嵌入完整基因
  • 上海电视节发布海报、宣传片:三十而励,光影新程
  • 法国参议院调查委员会公布雀巢“巴黎水”丑闻调查报告
  • 国家发改委:内卷式竞争扭曲市场机制、扰乱公平竞争秩序,必须整治
  • 这款小孩子最爱的饮料,害处竟大到不敢想象
  • 三件珍贵标本开箱!中国恐龙大展5月26日在沪开幕,明星标本汇聚一堂