LeetCode 55. 跳跃游戏 45. 跳跃游戏II——贪心算法

55. 跳跃游戏

labuladong 题解思路

给你一个非负整数数组 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

题解

这个问题可以通过贪心算法来解决。贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。对于跳跃游戏问题,我们可以采用以下策略:

  1. 初始化最远距离:设置一个变量来存储在遍历数组过程中能够到达的最远距离,初始时这个最远距离为0。

  2. 遍历数组:遍历数组中的每个元素,对于每个元素执行以下操作:

    • 更新最远距离:对于当前位置i,它能够到达的最远距离至少是i + nums[i],因此更新最远距离为max(当前最远距离, i + nums[i])
    • 判断能否继续向前:如果当前位置i大于最远距离,则说明无法从起点跳到当前位置,因此返回false
  3. 判断能否到达终点:如果能够遍历完整个数组,则表示可以到达终点,返回true;否则,返回false

下面是该算法的C++实现:

#include <vector>
using namespace std;bool canJump(vector<int>& nums) {int maxReach = 0;for (int i = 0; i < nums.size(); ++i) {if (i > maxReach) return false;maxReach = max(maxReach, i + nums[i]);if (maxReach >= nums.size() - 1) return true;}return (maxReach >= nums.size() - 1);
}

这段代码首先判断当前位置是否可达,然后更新最远可达距离。如果在某个位置发现该位置已经超出了之前能够达到的最远位置,则表明无法到达数组的最后位置。

在这个问题中,我们假设至少有一个位置可以被到达(即起始位置),因此算法至少会执行一次循环。如果能够遍历完整个数组,则意味着可以从起始位置跳到数组的最后位置。

45. 跳跃游戏 II

labuladong 题解思路

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]

每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:

  • 0 <= j <= nums[i]
  • i + j < n

返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]

示例 1:

输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2
  从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

示例 2:

输入: nums = [2,3,0,1,4]
输出: 2

提示:

  • 1 <= nums.length <= 104
  • 0 <= nums[i] <= 1000
  • 题目保证可以到达 nums[n-1]

题解

贪心

在“跳跃游戏 II”问题中,我们可以使用贪心算法来找到到达数组末尾的最小跳跃次数。这个问题的核心是在每一步中做出最优选择,即在当前能跳到的所有位置中选择一个能使得从这个位置开始能跳到的最远位置的点。

以下是用贪心算法解决这个问题的思路:

  1. 初始化:设置当前能到达的最远位置 maxReach、当前跳跃的结束位置 end 和跳跃次数 jumps

  2. 遍历数组:遍历数组中的每一个元素,并更新当前能到达的最远位置 maxReach

  3. 更新跳跃次数和跳跃结束位置:当遍历到当前跳跃的结束位置时,意味着需要进行一次新的跳跃(除非已经到达数组末尾)。此时更新跳跃次数,并将跳跃结束位置设置为当前能到达的最远位置。

  4. 返回结果:遍历完数组后,返回跳跃次数作为结果。

以下是这个贪心算法的 C++ 实现:

class Solution {
public:int jump(vector<int>& nums) {int maxReach = 0, end = 0, jumps = 0;int n = nums.size();for (int i = 0; i < n - 1; i++) {maxReach = max(maxReach, i + nums[i]);if (i == end) {jumps++;end = maxReach;}}return jumps;}
};

这个算法的时间复杂度是 O(n),其中 n 是数组 nums 的长度。这比动态规划的方法更高效,因为它避免了不必要的重复计算。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

配电房综合监控系统

配电房综合监控系统是一种集成了实时监控、数据采集、远程控制等多功能的系统&#xff0c;用于对配电房进行全方位的监测和管理。 力安科技配电室综合监控系统依托电易云-智慧电力物联网&#xff0c;实现配电室环境监测、有害气体监测、安防监控、采暖通风、门禁、灯光、风机、…

进阶C语言-字符函数和字符串函数

字符函数和字符串函数 &#x1f388;1.函数介绍&#x1f50e;1.1strlen函数&#x1f52d;1.1.1strlen函数的模拟实现&#x1f4d6;1.计数器法&#x1f4d6;2.递归法&#x1f4d6;3.指针-指针 &#x1f50e;1.2strcpy函数&#x1f52d;1.2.1strcpy函数的模拟实现 &#x1f50e;1…

Linux系统编程 day07 信号

Linux系统编程 day07 信号 1. 信号的介绍以及信号的机制2. 信号相关函数2.1 signal2.2 kill2.3 abort和raise2.4 alarm2.5 setitimer 3. 信号集4. 信号捕捉函数6. SIGCHLD信号7. SIGUSR1与SIGUSR2 1. 信号的介绍以及信号的机制 信号是信息的载体&#xff0c;在Linux/Unix环境下…

deepin系统无法进入桌面图形界面问题解决

当deepin系统无法进入桌面图形界面时&#xff0c;可以重新安装dde桌面 sudo apt-get install dde安装后重启看是否可以启动桌面。 如果找不到文件管理器可以从终端中执行&#xff1a;dde-file-manager 即可打开文件管理器&#xff0c;如果没有这个命令&#xff0c;估计没有安装…

企业微信http协议接口开发,发送位置消息

产品说明 一、 hook版本&#xff1a;企业微信hook接口是指将企业微信的功能封装成dll&#xff0c;并提供简易的接口给程序调用。通过hook技术&#xff0c;可以在不修改企业微信客户端源代码的情况下&#xff0c;实现对企业微信客户端的功能进行扩展和定制化。企业微信hook接口…

如何有效的进行 E2E

一、前言 本文作者介绍了什么是E2E测试以及E2E测试测什么&#xff0c;并从对于被测系统、测试用例、测试自动化工具、测试者四个方面的要求&#xff0c;介绍了如何保证E2E测试有效性&#xff0c;干货满满&#xff0c;值得学习。 二、什么是E2E测试 相信每一个对自动化测试感…

华纳云:android中listview数据动态加载的方法

在 Android 中&#xff0c;使用 ListView 动态加载数据通常涉及到使用适配器&#xff08;Adapter&#xff09;来将数据与 ListView 关联。以下是一般的步骤&#xff1a; 1. 创建数据源&#xff1a; 首先&#xff0c;创建一个数据源来存储要显示在 ListView 中的数据。这可以是…

需求不明确的情况下,测试该如何处理?

当需求不明确的情况下&#xff0c;测试团队可以采取以下措施来处理&#xff1a; 1. 与项目团队进行沟通&#xff1a;测试团队应与项目团队密切合作&#xff0c;与业务分析师、产品经理等相关人员进行沟通&#xff0c;以获取更多的需求细节和背景信息。通过与相关方的交流&…

玻璃钢实验室污水处理设备生产厂家价格

玻璃钢实验室污水处理设备生产厂家价格 设备简介 玻璃钢一体化污水处理设备采用世界上的生物处理工艺&#xff0c;集去除BOD5、COD、NH3-N于一身&#xff0c;它被广泛的应用于宾馆,别墅小区及居民住宅小区的生活污水和与之相似的工业有机污水处理&#xff0c;替代了去除率很低&…

zookeeper 客户端常用命令简单记录(实操课程系列--watcher功能测试)(发布订阅功能测试)

本系列是zookeeper相关的实操课程&#xff0c;课程测试环环相扣&#xff0c;请按照顺序阅读测试来学习zookeeper。阅读本文之前&#xff0c;请先阅读----zookeeper 单机伪集群搭建简单记录&#xff08;实操课程系列&#xff09; 1、命令行工具切换到zookeeper的bin目录下面&am…

springboot自定义校验注解的实现

自定义校验注解的实现 通过谷粒商城项目学习了自定义校验器的实现一、编写自定义校验注解二、自定义注解的校验器三、关联自定义的校验器和自定义的校验注解总结 通过谷粒商城项目学习了自定义校验器的实现 近日在学习雷神的谷粒商城项目&#xff0c;其中有一个自定义校验的实…

国外客户跟我要佣金,该给不该给?

“Jack&#xff0c;这次你要是不帮我&#xff0c;我就死定了&#xff01;” 收到美国公司采购Antony的信息时&#xff0c;我有些哭笑不得&#xff0c;因为在我电脑屏幕上除了他的信息外&#xff0c;还有来自他公司监察部门的邮件&#xff1a; “jack先生&#xff0c;我们调查…

二极管钳位电路的作用

1、使用钳位二极管的瞬态保护即将输出电压限定在某个区间 钳位二极管不仅仅是为了改变电压基线。它们在缓解瞬态事件方面非常有用&#xff0c;尤其是ESD和雷电浪涌。例如&#xff0c;当输入电压高于 Vh 时&#xff0c;D1 正向偏置。因此&#xff0c;过多的电流流过 D1 而不是负…

LeetCode 274. H指数——排序

274. H 指数 给你一个整数数组 citations &#xff0c;其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义&#xff1a;h 代表“高引用次数” &#xff0c;一名科研人员的 h 指数 是指他&#xff08;她&…

Linux Centos系统安装Mysql8.0详解

本文是基于服务器Linux Centos 8.0系统 安装 Mysql8.0真实运维工作实战为例&#xff0c;详细讲解安装的全过程。 1&#xff0c;检查卸载mariadb Mariadb数据库是mysql的分支&#xff0c;mariadb和mysql会有冲突&#xff0c;所以安装Mysql前&#xff0c;首先要检查是否安装了m…

java学习part23异常try catch

124-异常处理-异常的概述与常见异常的举例_哔哩哔哩_bilibili 1.异常 2.try catch 3.finally 类似golang的defer 一定执行的语句

7-1 哈夫曼树与哈夫曼编码

哈夫曼树与哈夫曼编码 题目描述输入格式输出格式输入样例输出样例 分数 30 作者 伍建全 单位 重庆科技学院 题目描述 哈夫曼树(Huffman Tree)又称最优二叉树&#xff0c;是一种带权路径长度最短的二叉树。所谓树的带权路径长度&#xff0c;就是树中所有的叶结点的权值乘上其到…

为什么要在项目中使用TypeScript?

随着越来越多的开发人员采用TypeScript&#xff0c;人们需要了解在下一个项目中应该使用TypeScript的原因。尽管它在早期应用中遇到了一些阻力&#xff0c;但在过去十年&#xff0c;它迅速成为一种广泛使用的编程语言。 以下介绍如何使用TypeScript以及它给开发人员带来的一些好…

关于JSON

1、JSON不是一种语言 2、JSON是一种简化的传输方式 3、也是一种数据格式 4、且具有自验证行 JSON 具有自验证性可以理解为&#xff0c;JSON 数据本身包含了足够的信息&#xff0c;可以通过解析和验证 JSON 数据自身的结构、完整性和语法正确性。种特性也被称为 "self-…

堆在排序中的应用

堆排序 1、堆排序原理 堆排序是利用到了堆这种数据结构&#xff0c;我们首先回顾一下二叉堆的特性&#xff1a; 最大堆的堆顶是整个堆中的最大元素。最小堆的堆顶是整个堆中的最小元素。 以最大堆为例&#xff0c;如果删除一个最大堆的堆顶&#xff08;并不是完全删除&…