【跳跃游戏】——贪心算法

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. 1 <= nums.length <= 104
  2. 0 <= nums[i] <= 105

贪心算法

  1. 整体目标:
    • 判断从数组的第一个下标出发,能否通过按照数组中每个位置所规定的最大跳跃长度进行跳跃,最终到达最后一个下标。
  2. 贪心策略:
    • 在每一个位置,我们不需要去考虑所有可能的跳跃路径,而是只关注当前位置能够跳到的最远位置furthest
    • 对于当前位置i,我们可以计算出它能跳到的最远位置为 i + nums[i]
    • 不断更新最远距离furthest
    • 判断是否到达终点
  3. 贪心策略判断:
    • 如果遍历过程中,遍历到某位置i时,i超越了能跳到的最远位置furthest。说明无法继续前进,不可能到达末尾
    • 如果遍历整个数组,一直没出现以上情况,说明可以到达末尾!

代码实现

根据以上思路很容易写出代码:

class Solution:def canJump(self, nums: List[int]) -> bool:# 贪心算法?furthest = 0 # 初始化最远距离# 从头开始遍历ifor i in range(len(nums)):furthest = max(i + nums[i], furthest)if i > furthest:return Falsereturn True
————————————————————————————————————
解答错误
107 / 173 个通过的测试用例官方题解
输入
nums =
[3,2,1,0,4]添加到测试用例
输出
true
预期结果
false

哪里出了问题?
思考:

if i > furthest:return False

实际上,应该加上>=

解答错误
152 / 173 个通过的测试用例官方题解
输入
nums =
[0]添加到测试用例
输出
false
预期结果
true

忘记考虑空集了!

class Solution:def canJump(self, nums: List[int]) -> bool:# 贪心算法?if not nums:return Falsefurthest = nums[0] # 初始化最远距离# 从头开始遍历ifor i in range(len(nums)):furthest = max(i + nums[i], furthest)if i >= furthest:return Falsereturn True
————————————————————————————————————————————————
解答错误
152 / 173 个通过的测试用例官方题解
输入
nums =
[0]添加到测试用例
输出
false
预期结果
true

通过用例完全没加…

正确答案:

def canJump(nums):n = len(nums)furthest = 0for i in range(n):if i > furthest:return Falsefurthest = max(furthest, i + nums[i])return True

这几个疑问:

疑问一:为什么先判断 if i > furthest: 再执行 furthest = max(furthest, i + nums[i])

在使用贪心算法解决“跳跃游戏”问题的这段代码中,furthest 变量用于记录从起始位置能够到达的最远位置。

  • 先判断能否继续前进:当我们遍历数组 nums 时,在每一个位置 i,我们首先需要判断当前位置是否已经超出了之前所能到达的最远位置(即 i > furthest)。如果已经超出了,那就意味着按照之前的跳跃规则,我们无法到达当前位置 i,更不可能到达数组的最后一个下标了,所以此时应该直接返回 False,表示无法完成跳跃到达最后一个下标。

  • 更新最远可到达位置:只有当当前位置 i 没有超出之前记录的最远位置 furthest 时,我们才继续更新 furthest 的值。通过 furthest = max(furthest, i + nums[i]),我们将当前位置 i 加上它能跳跃的最大长度 nums[i] 得到的新的可能到达的最远位置,与之前记录的最远位置 furthest 进行比较,取两者中的最大值作为新的 furthest。这样就能不断更新我们能够到达的最远位置信息,以便后续继续判断是否能到达最后一个下标。

如果先更新 furthest 再判断 i > furthest,就可能会出现一种情况:在更新 furthest 之后,当前位置 i 实际上已经是无法到达的了(因为是基于之前错误地认为能到达而更新的 furthest),但却没有及时发现并返回 False,导致后续的计算出现错误,最终得到错误的结果。所以必须先判断能否继续前进,再更新最远可到达位置。

疑问二:为什么 if i > furthest: 没有等于号=

这里不包含等于号是因为当 i == furthest 时,我们仍然有可能从当前位置继续跳跃到达更远的地方。

假设当前位置 i 刚好等于之前记录的最远位置 furthest,这意味着我们刚好到达了之前所能到达的最远距离,但此时我们还可以根据当前位置 i 对应的元素 nums[i] 所表示的跳跃长度进行跳跃,有可能跳到更远的位置,所以此时不能判定为无法到达后续位置,不能返回 False

只有当 i 严格大于 furthest 时,才说明我们已经无法按照之前的跳跃规则到达当前位置 i 了,也就不可能到达最后一个下标,此时才返回 False

疑问三:为什么不用写特解情况,比如 nums 为空或者只有一个元素等!

  • 对于空数组情况:在Python中,如果直接对空数组执行 for i in range(n)(其中 n 是数组长度)这样的操作,实际上循环体不会被执行。因为空数组的长度为 0range(0) 会生成一个空的可迭代对象,所以循环内的代码不会被执行到。而在这种情况下,由于没有进行任何有效的跳跃操作,默认就可以认为是无法到达最后一个下标(因为根本就没有下标可供到达),所以最终函数会返回一个默认值(在Python中函数如果没有显式返回值,默认返回 None,这里由于代码结构,实际上返回值应该是根据循环执行情况确定的,循环未执行就相当于返回了 False 的效果),这与我们期望的空数组时返回 False 的结果是相符的。

  • 对于只有一个元素的数组情况:当数组只有一个元素时,我们最初位于数组的第一个下标(也就是唯一的这个下标),此时不需要进行任何跳跃就已经到达了“最后一个下标”(因为只有一个下标)。在代码中,当进入循环时,i 的值为 0,此时 furthest 初始值为 0(假设没有在循环外对其进行额外赋值),那么 i == furthest,根据前面的分析,这种情况不会返回 False,而是会继续执行 furthest = max(furthest, i + nums[i]),更新后的 furthest 依然为 0(因为 nums[0] 加上 0 还是 0),然后循环结束,最终函数会返回 True,这也符合我们对于只有一个元素的数组能到达最后一个下标(其实就是它本身)的预期结果。

所以在这段代码的逻辑下,不需要额外针对 nums 为空或者只有一个元素等特殊情况单独编写处理代码,代码本身的执行逻辑已经能够正确处理这些特殊情况并得到符合预期的结果。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux磁盘分区

文章目录 磁盘分区 &#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;Linux专栏&#xff1a;点击 ⏰️创作时间&#xff1a;2024年11月12日13点20分 磁盘分区 MBR 主启动记录分区方案指定了运行BIOS固件的系统上应如何对磁盘进行分区&#xff0c;存在与驱动开…

2. Spring Cloud 微服务基础环境搭建

2. Spring Cloud 微服务基础环境搭建 文章目录 2. Spring Cloud 微服务基础环境搭建前言1. 微服务需求解析2. 具体搭建微服务步骤&#xff1a;2.1 创建父工程 &#xff0c;用于聚合其它微服务模块2.1.1 需求说明/图解2.1.2 具体实现步骤2.1.3 注意事项和具体细节 2.2 创建会员中…

微信朋友圈营销

朋友圈营销4567法则

【赵渝强老师】MySQL InnoDB的表空间

InnoDB存储引擎目前是MySQL默认的存储引擎&#xff0c;它主要由三部分组成&#xff0c;分别是&#xff1a;存储结构、内存结构和线程结构。InnoDB的存储结构又可以分为逻辑存储结构和物理存储结构。InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地…

docker安装redis

1、拉取镜像 docker pull redis:latest运行之前需要再/data/redis创建redis.conf配置文件 内容如下 # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1 #bind 127.0.0.1protected-mode noport 6379tcp-backlog 511requirepass roottimeout 0tcp-keepalive 300daemonize no…

vue项目多入口文件。vue.config.js如何修改配置

我们知道vue项目是单入口。指定一个入口文件去加载他所有的依赖。如果我们希望他有多个入口文件怎么办呢&#xff1f; 我们可以在public下面新建一个html的文件 然后src下新增一个文件夹&#xff0c;用来放APP.vue和 main.js。 然后修改vue.config.js。把他的pages改成2个入…

NCC前端调用查询弹框

系统自带的查询模板 弹框 调启使用默认的 查询模板 是在 单据模板的 列表模板中&#xff0c;有个查询区域 &#xff0c;查询区域就是查询模板内容如果在列表页做客开 新增按钮 调启查询模板 无问题&#xff0c;但是目前需求是需要再卡片页面下调启系统标准的调启模板代码 //调…

SpringBoot中的注解详解(二)

四、Param() &#xff08;mapper包 Dao层&#xff09; Param()&#xff1a; 功能&#xff1a; 用于在Mapper接口的方法参数上标记参数名称&#xff0c;以便在SQL语句中引用这些参数。 参数命名&#xff1a;在Mapper接口的方法参数上使用Param注解&#xff0c;可以为参数指定一…

一文1800字使用Jmeter进行http接口性能测试!

接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系等。 为什么要做接口测试&#xff1f; 越底层发现b…

新版flask pin码计算

Python debug pin码计算 需开启debug from flask import Flask app Flask(__name__) app.route("/") def index():return "Hello World" app.run(debugTrue) /console路由填入上方控制台的 PIN 码即可执行 Python 命令 Flask 的 PIN 码计算仅与 werkze…

比 PyTorch 更快的嵌入Python库:FastEmbed

嵌入生成 已成为自然语言处理&#xff08;NLP&#xff09;中不可或缺的一部分。 无论是智能推荐、文本相似度计算&#xff0c;还是聊天机器人&#xff0c;嵌入技术都扮演着重要角色。然而&#xff0c;我们常常会陷入繁重的库和庞大的模型中&#xff0c;耗时费力。 今天&#…

大模型部署解决方案之TorchServe+vLLM

TorchServe 是PyTorch 中将模型部署到生产环境的一个解决方案。它用HTTP 或HTTPS API 封装模型&#xff0c;可以处理多种任务&#xff0c;包括为部署模型分配workers、负责客户端和服务器之间通信等。 10月份发布的TorchServe 0.12 增加了对GenAI的支持&#xff0c;简化了大语…

博弈论(零和博弈)英文版题解

翻译&#xff1a; 假设我们有一个两人零和游戏&#xff0c;每个玩家有两种行动&#xff0c;行收益矩阵如下&#xff1a; 计算行和列玩家的最小最大最优策略以及游戏的价值。 X Y A a11 a12 B a21 a22 选项&#xff1a; 1. 行玩家&#x…

虚拟现实辅助工程技术应用于员工培训

你还在使用传统的入职方法吗&#xff0c;比如印刷指南、演示、课堂培训、讲座等等&#xff1f;是时候改变了。虚拟现实辅助工程技术提供了一个机会&#xff0c;可以让新员工的入职过程更高效、更有趣&#xff0c;也更令人兴奋。想象一下这样一个场景&#xff0c;新员工可以在第…

【健康警钟】胆已切除,生活调理有“胆”更精彩!必看指南!

在现代社会&#xff0c;由于生活习惯、饮食习惯等多种因素&#xff0c;一些人可能不得不面对胆囊切除手术。虽然手术能够有效解决胆囊结石、胆囊炎等问题&#xff0c;但胆囊作为人体的一部分&#xff0c;其功能的丧失无疑会对生活带来一定影响。那么&#xff0c;胆被割了之后&a…

windows NGIMX配置WebSocket反向代理

linux下 据说nginx是要有 stream的模块 Linux安装Nginx步骤之后续&#xff0c;带stream模块-CSDN博客 Nginx从1.3.13版本就开始支持WebSocket linux 下参考如下链接 配置 Nginx 反向代理 WebSocket - 哈喽哈喽111111 - 博客园 (cnblogs.com) SSL的配置参考 【Linux】采用…

三种读取配置文件的方式

在编写JDBC的util包以读取文件时&#xff0c;配置文件的位置会影响其读取方式。当前&#xff0c;默认配置文件直接放置在src文件夹下。 当读取.properties文件代码写法为&#xff1a; Properties props new Properties(); props.load(new FileInputStream("db.propertie…

丹摩征文活动|CogVideoX-2b:从安装到上线,轻松搞定全过程!

CogVideoX-2b&#xff1a;从安装到上线&#xff0c;轻松搞定全过程&#xff01; CogVideoX简介 CogVideoX的推出标志着视频生成技术的一次重大突破。过去&#xff0c;如何在保持高效的同时提升视频质量一直是一个难题&#xff0c;但CogVideoX 通过其先进的3D变分自编码器&…

工位管理优化:Spring Boot企业级系统

3系统分析 3.1可行性分析 通过对本企业级工位管理系统实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本企业级工位管理系统采用SSM框架&#xff0c;JAVA作为开…

EMQX服务器的搭建,实现本地机和虚拟机之间的MQTT通信(详细教程)

前言 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的&#xff0c;这些特点使它适用范围非常广泛。 MQTT协议中有三种身份&#xff1a;发布者&#xff08;Publish&#xff09;、代理&#xff08;Broker&#xff09;&#xff08;…