55. 跳跃游戏(力扣LeetCode)

文章目录

  • 55. 跳跃游戏
    • 贪心
      • 每一次都更新最大的步数
    • 取最大跳跃步数(取最大覆盖范围)

55. 跳跃游戏

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

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

示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。

示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 105

贪心

每一次都更新最大的步数

这段代码是用于解决“跳跃游戏”问题的C++实现,下面是对这段代码的详细注释:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        int coust = nums[0]; // 初始化当前能跳到的最远距离为数组的第一个元素
        // 如果第一个元素为0且数组不是只有一个元素,则无法到达最后一个下标,直接返回false
        if(coust == 0 && nums[nums.size()-1] != 0) return false;

        // 从数组的第二个元素开始遍历
        for(int i = 1; i < nums.size(); i++) {
            // 更新当前能跳到的最远距离。比较当前位置能跳的距离nums[i]和前一步剩余的跳跃力coust-1的较大值
            coust = max(nums[i], coust-1);
            // 如果在非数组末尾位置coust已经减到0,说明无法再向前跳跃,返回false
            if(i != nums.size()-1 && coust == 0)
                return false;
        }
        // 如果能顺利遍历完数组,说明可以到达最后一个下标,返回true
        return true;
    }
};

解题思路总结:

  • 初始化:利用变量coust来记录从当前位置起能够跳跃到的最远距离,初始值为数组的第一个元素nums[0]
  • 特殊情况处理:如果nums[0]为0且数组长度大于1(即非只有一个元素),意味着无法移动,因此直接返回false
  • 遍历数组:从索引1开始遍历数组,对于每一个位置,更新coust为在当前位置能跳的距离nums[i]coust-1中的较大值。这里coust-1代表从前一个位置跳到当前位置后,剩下的最远跳跃距离。
  • 判断是否能继续跳跃:在遍历过程中,如果在非数组末尾位置发现coust已经为0,意味着不能再向前进,因此返回false
  • 遍历完成:如果能遍历完整个数组,意味着可以跳到最后或超过最后的位置,因此返回true

通过这种方法,代码高效地解决了“跳跃游戏”的问题,它的时间复杂度为O(n),因为只需要遍历一次数组。

取最大跳跃步数(取最大覆盖范围)

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

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

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

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

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

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

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

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

如图:
在这里插入图片描述
i 每次移动只能在 cover 的范围内移动,每移动一个元素,cover 得到该元素数值(新的覆盖范围)的补充,让 i 继续移动下去。

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

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

C++代码如下:

class Solution {
public:
    bool canJump(vector<int>& nums) {
        if(nums.size() == 1) return true; // 如果数组只包含一个元素,那么已经在最后一个下标,返回true
        int cover = 0; // 初始化可以到达的最远下标为0
        // 遍历数组,但只遍历到当前能覆盖的最远距离
        for(int i = 0; i <= cover; i++) {
            // 更新能到达的最远下标,是当前位置加上该位置能跳的最远长度,和之前的cover中的较大值
            cover = max(i + nums[i], cover);
            // 如果更新后的cover已经能覆盖到数组的最后一个位置或更远,返回true
            if(cover >= nums.size() - 1) 
                return true;
        }
        // 如果遍历结束后,cover未能覆盖到数组的最后一个位置,返回false
        return false;
    }
};

解题思路总结:

  • 特殊情况处理:当数组只有一个元素时,显然已经在最后一个下标,因此直接返回true
  • 初始化覆盖距离:用cover变量来记录当前可以到达的最远下标,初始值为0。
  • 遍历数组:通过一个循环遍历数组,但只遍历到当前cover所能到达的最远距离。这是因为如果当前位置超过了cover能到达的范围,说明这个位置是不可达的。
  • 更新覆盖距离:在每个位置,尝试更新cover。计算当前位置i加上nums[i](从当前位置能跳的最远距离)与cover的较大值,来更新cover
  • 判断是否能到达末尾:在这个过程中,如果cover的值大于等于数组的最后一个下标,意味着可以到达最后,因此返回true
  • 遍历结束:如果循环结束时,cover的值未能覆盖到数组的最后一个下标,则说明不能到达末尾,返回false

这种方法的优点是运行效率高,因为它的时间复杂度为O(n),只需遍历一次数组即可。通过不断更新可以到达的最远距离,这种贪心算法简洁而有效地解决了问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/455685.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数理统计实验(三)】假设检验的R实现

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

python基于flask考研学习交流系统30vy7附源码django

考研在线学习与交流平台根据实际情况分为前后台两部分&#xff0c;前台部分主要是让用户使用的&#xff0c;包括用户的注册登录&#xff0c;首页&#xff0c;课程信息&#xff0c;在线讨论&#xff0c;系统公告&#xff0c;后台管理&#xff0c;个人中心等功能&#xff1b;后台…

OpenCV filter2D函数详解

OpenCV filter2D函数简介 OpenCV filter2D将图像与内核进行卷积&#xff0c;将任意线性滤波器应用于图像。支持就地操作。当孔径部分位于图像之外时&#xff0c;该函数根据指定的边界模式插值异常像素值。 该函数实际上计算相关性&#xff0c;而不是卷积&#xff1a; filter…

python爬虫(9)之requests模块

1、获取动态加载的数据 1、在开发者工具中查看动态数据 找到csdn的门户的开发者工具后到这一页面。 2、加载代码 import requests headers {User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36…

数据仓库为什么要分层建设?每一层的作用是什么?

在数字化时代&#xff0c;数据已成为企业最宝贵的资产之一。为了更好地管理和利用这些数据&#xff0c;许多企业都建立了数据仓库。然而&#xff0c;数据仓库并非简单的数据存储工具&#xff0c;而是一个复杂的数据处理和分析系统。其中&#xff0c;分层建设是数据仓库设计的重…

第六篇【传奇开心果系列】Python的自动化办公库技术点案例示例:大学生数据全方位分析挖掘经典案例

传奇开心果博文系列 系列博文目录Python的自动化办公库技术点案例示例系列 博文目录前言一、Pandas库全方位分析挖掘大学生数据能力介绍二、大学生学生成绩数据分析数据挖掘示例代码三、大学生选课数据分析数据挖掘示例代码四、大学生活动参与数据分析数据挖掘示例代码五、大学…

如何在 Azure 上备份 windows 虚拟机并恢复

起因 Azure 在 windows 虚拟机备份/还原上和通常的虚拟机备份有所区别&#xff0c;一般的虚拟机备份在控制台的上的操作通常是选择将目标虚拟机备份成镜像&#xff0c;还原的时候选择备份好的镜像即可。 但是对于 windows 虚拟机的备份/还原需要借助其磁盘进行操作。下面是操…

MySQL学习Day32——数据库备份与恢复

在任何数据库环境中&#xff0c;总会有不确定的意外情况发生&#xff0c;比如例外的停电、计算机系统中的各种软硬件故障、人为破坏、管理员误操作等是不可避免的&#xff0c;这些情况可能会导致数据的丢失、 服务器瘫痪等严重的后果。存在多个服务器时&#xff0c;会出现主从服…

【CSP试题回顾】201803-1-跳一跳

CSP-201803-1-跳一跳 解题代码 #include <iostream> using namespace std;int score, s, last_s -1;int main() {while (true){cin >> s;if (s 0) break;else if (s 1) {score s;last_s s;}else if (s 2) {if (last_s>2){score last_s;last_s 2;}else…

Controller Spawner couldn‘t find the expected controller_manager ROS interface.

rosservice list | grep controller_manager 如果没有输出&#xff0c;说明controllermanager没启动 具体通过以下启动&#xff1a; <gazebo> <plugin name"ros_control" filename"libgazebo_ros_control.so"> <!-- robotNamespace>…

Vue:内置组件:KeepAlive(缓存组件实例)

一、作用 <KeepAlive></KeepAlive>能缓存包裹的所有组件&#xff0c;保证组件在切换时维持组件状态。 默认情况下&#xff0c;一个组件实例在被替换掉后会被销毁。这会导致它丢失其中所有已变化的状态——当这个组件再一次被显示时&#xff0c;会创建一个只带有初…

深入学习React开发:从基础到实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 引言 React是一款流行的JavaScript库&#xf…

EMC测试整改:优化电磁兼容性,提升产品质量?|深圳比创达电子EMC

在电子设备领域&#xff0c;电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;简称EMC&#xff09;测试是确保产品在电磁环境下能够正常工作而不对周围环境和其他设备造成干扰的关键步骤。然而&#xff0c;即使通过了初步的EMC测试&#xff0c;仍然可能存在一些…

基于uniapp的新闻文章视频资讯系统 微信小程序

基于Android的视频资讯APP组织结构如下&#xff1a; 第一章系统概述&#xff0c;首先简单的阐述基于Android的视频资讯APP背景&#xff0c;分析基于Android的视频资讯APP的意义&#xff0c;说明基于Android的视频资讯APP的研究内容。 第二章技术介绍&#xff0c;介绍基于Androi…

4.MAC平台Python的下载、安装(含Python2.7+Python3.12双版本环境变量配置)——《跟老吕学Python编程》

4.MAC平台Python的下载、安装&#xff08;含Python2.7Python3.12双版本环境变量配置&#xff09;——《跟老吕学Python编程》&#xff09;——跟老吕学Python编程 一、下载MAC版Python1.Python官网2.MAC版Python下载网址 二、在MAC安装Python1.在MAC安装Python2.阅读Python重要…

每日学习笔记:C++ STL 的forward_list

定义 特点 操作函数 元素查找、移除或安插 forward_list::emplace_after arg...指的是元素构造函数的参数&#xff08;0~N个&#xff09; #include <iostream> #include <memory> #include <list> #include <forward_list> using namespace std;class…

SSA-LSTM多输入分类预测 | 樽海鞘优化算法-长短期神经网络 | Matlab

目录 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 亮点与优势&#xff1a; 二、实际运行效果&#xff1a; 三、算法介绍&#xff1a; 四、完整程序下载&#xff1a; 一、程序及算法内容介绍&#xff1a; 基本内容&#xff1a; 本代码基于Matlab平台编译&am…

《动手学深度学习》第2章 预备知识 部分笔记

文章目录 一、数据操作二、数据预处理1.函数&#xff08;1&#xff09;递归创建目录&#xff1a;os.makedirs()&#xff08;2&#xff09;读取CSV文件&#xff1a;pandas.read_csv()&#xff08;3&#xff09;合并路径&#xff1a;os.path.join()&#xff08;4&#xff09;按索…

stl--set和map使用技巧

文章目录 set使用场景&#xff1a;简单使用 map使用场景&#xff1a;简单实用 set 使用场景&#xff1a; 底层实现为红黑树&#xff0c;默认排序&#xff0c;适合搜索数组中的某一个元素使用。 简单使用 set<int> s1 {1,3,4,5};s1.insert(2);s1.erase(3);for(auto &…

用户视角的比特币和以太坊外围技术整理

1. 引言 要点&#xff1a; 比特币L2基本强调交易内容的隐蔽性&#xff0c;P2P交易&#xff08;尤其是支付&#xff09;成为主流&#xff0c;给用户带来一定负担&#xff08;闪电网络&#xff09;在以太坊 L2 中&#xff0c;一定程度上减少了交易的隐蔽性&#xff0c;主流是实…