45. 跳跃游戏 II (贪心)

题目链接:力扣

解题思路:贪心,尽可能地找到下一跳能够跳到的最远距离,这样到达终点时,所需跳跃次数最少

以nums = [2,3,1,1,4,2]为例:

  1. 以当前位置begin作为起跳点,能够跳跃的最远距离为m,那么接下来的m个位置都能作为下一次的起跳点。从这m个位置中选择能够跳远最远的点最为下一次起跳点。result保存最终跳跃次数
    1. 初始时在位置0,num[0]=2,那么接下来的2个位置,都能作为下一次的起跳点 [2,3,1,1,4,2],可以选择3和1,选择3能够跳跃的最远索引为4,选择1能够跳跃的最远索引为3,显然选择3能够跳跃最远,即选择索引为1的位置作为下一跳的起跳点
  2. 从上次选择的起跳点作为新的begin,重复步骤1,直到能够跳跃到最后,每次跳跃时result自增1
    1. 上一次的起跳点的索引为1,num[1]=3,接下来的3个位置都能作为下一次跳跃的起跳点。[2,3,1,1,4,2],显然选择4,即从索引为4的位置开始跳能够跳的最远,当选择从索引为4的位置跳时,能够跳跃的最后,结束,result即所求。
    2. 一个小优化:其实可以不用从上一次选择的起跳点的下一个位置作为本次起跳点的开始位置,而是直接将上一次起跳范围的结束位置作为本次起跳点的开始位置:
      1. 上一次的起跳点选择范围为:[2,3,1,1,4,2],本次起跳的范围[2,3,1,1,4,2]
      2. 其中本次起跳的范围可以直接为:[2,3,1,1,4,2],即将上一次跳跃的最远距离end作为下一次起跳的开始位置begin。而不用上一次选择的起跳点的下一个位置作为begin,这样可以减少选择起跳点的循环次数
      3. 比如上一次的起跳范围为: [begin1,a1,a2,a3,end1],假如选择a1作为起跳点能够跳跃的最远距离为m,则下一跳的跳跃范围为[begin1,a1,a2,a3,end1,b1,b2,...,m],仔细观察,可以发现a2,a2,end1这三个位置在本次跳跃中的位置选择可以不用考虑,因为从这些位置出发,能够跳跃的最远位置肯定小于m(因为选择a2此能够跳跃最远m,其他位置能够跳跃的距离都比m小),所以本次跳跃的范围只需要从[begin1,a1,a2,a3,end1,b1,b2,...,m],这些位置中选择就可以了。
  3. 解题的关键在于:下一跳的起跳点的选择,当前位置begin能够跳跃的最远距离为m,则begin后面的m个位置都能够最后下一次的起跳点,从这m个位置中选择能够跳跃最远的位置作为新的起跳点。其中可以使用begin,end保存下一跳能够选择的起跳点,end=begin+m,下一条的起跳点范围为(begin,end],左开右闭区间。
    1. 选择每次起跳点时可以使用for选择,从(begin,end]区间进行选择
    2. 每完成一次跳跃,更新begin和end,并令result+1
    3. 当下一跳能够跳跃的最远距离大于等于nums.length-1,算法结束

AC代码:

class Solution {public static int jump(int[] nums) {int result = 0;//下一跳的选择区间[begin,end],左闭右闭区间//能够选择的跳跃区间的左边界int begin = 0;//能够选择的跳跃区间的右边界int end = 0;while (end < nums.length - 1) {int nextEnd = 0;for (int i = begin; i <= end; i++) {//从[begin,end]区间中计算能够跳跃的最远位置,并更新左边界nextEnd = Math.max(nextEnd,i+nums[i]);}//下一次能够选择的起跳点的开始位置begin = end+1;//下一次能够选择的起跳点的结束位置end= nextEnd;result++;}return result;}
}

 优化

在上述while循环包含的for循环中,begin和end的更新都是从前往后更新的,可以优化掉外层的循环,只需要在完成一次跳跃时更新下一次能够跳跃的最远距离,使用一个for循环从前往后遍历:

  1. 初始时,最小跳跃次数result=0,end=0,nextEnd=0;
  2. 每遍历一个位置更新一次能够跳跃的最远距离nextEnd=Math.max(nextEnd,i+nums[i])。
  3. 当i==end时,说明上一次的跳跃的边界结束了,开始下一次跳跃点的选择,这个时候更新end=nextEnd,result++

AC代码

class Solution {public static int jump(int[] nums) {int result = 0;int end = 0;int nextEnd = 0;for (int i = 0; i < nums.length - 1; i++) {nextEnd = Math.max(nextEnd, i + nums[i]);if (i == end) {end = nextEnd;result++;}}return result;}
}

上面两种算法的时间复杂度都是O(n),效率一样。不过后面这种算法做法更加简洁

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

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

相关文章

MySQL每日一练:多表查询——连接查询、子查询

目录 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; emp表&#xff1a; 2、插入数据&#xff1a; dept表&#xff1a; emp表&#xff1a; 3、 按条件查找 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; create table dept (…

以太网(Ethernet)入门了解

以太网&#xff08;Ethernet&#xff09;是一种常见的局域网&#xff08;LAN&#xff09;通信协议&#xff0c;它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议&#xff0c;它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

MySQL 多表查询练习

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建score表。SQL代码如下&#xff1a; CREATE TABLE s…

OpenCV 入门教程:Laplacian算子和Canny边缘检测

OpenCV 入门教程&#xff1a; Laplacian 算子和 Canny 边缘检测 导语一、Laplacian 算子二、Canny 边缘检测三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 边缘检测在图像处理和计算机视觉领域中起着重要的作用。 Laplacian 算子和 Canny 边缘检测是两种常用的边缘检测…

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN &#xff1f; 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

Ubuntu18.04 系统安装 Docker

1、首先更新软件源&#xff1a; sudo apt-get updatesudo apt-get upgrade 2、安装Docker&#xff1a; sudo apt install docker -y 3、查看安装的Docker apt list docker 4、查看docker 进程 ps -ef|grep docker 5、查看docker 版本有问题 6、开启Docker服务 systemctl…

10_SPI_Flash 连续写实验

10_SPI_Flash 连续写实验 1. 实验目标2. 连续写方法3. 操作时序4. 流程框图4.1 顶层模块4.2 连续写模块 5. 波形图6. RTL6.1 flash_seq_wr_ctrl6.2 spi_flash_seq_wr 7. Testbench 1. 实验目标 使用页写指令&#xff0c;将串口发送过来的连续不定量数据写入 Flash。本实验中&a…

Web安全——数据库mysql学习

数据库mysql基础 Web安全分享一、数据库的基本操作1、MYSQL登录与退出2、MYSQL数据库的一些解释3、MYSQL注释符有三种&#xff1a; 二、数据库的一些基本操作1、数据库的增删改查(sql语句) 三、table 表的操作1、查看表结构2、查看表的内容3、建立表4、约束条件5、修改表的操作…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层&#xff1a;建立、维护、断开物理连接&#xff0c;定义了接口及介质&#xff0c;实现了比特流的传输。 1.1传输层介质分类 有线介质&#xff1a;网线 &#xff08;双绞线&#xff09;光纤 无线: 无线电 1.2 双绞线 五类线 cat5 &#xff1a;适用 10…

第二次CCF计算机软件能力认证

第一题&#xff1a;相邻数对 给定 n 个不同的整数&#xff0c;问这些数中有多少对整数&#xff0c;它们的值正好相差 1。 输出格式 输入的第一行包含一个整数 n&#xff0c;表示给定整数的个数。 第二行包含所给定的 n 个整数。 输出格式 输出一个整数&#xff0c;表示值正好相…

KMP算法

KMP KMP 算法是一个快速查找匹配串的算法&#xff0c;它的作用其实就是本题问题&#xff1a;如何快速在「原字符串」中找到「匹配字符串」。 而 KMP 算法的复杂度为 O(mn)实际上是O(N),因为O(M)不可能大于O(N) KMP 之所以能够在 O(mn)复杂度内完成查找&#xff0c;是因为其能…

巴斯夫与长三角物理研究中心开展合作,专注固态和钠离子电池领域

“巴斯夫&#xff0c;全球知名化学公司&#xff0c;宣布与长三角物理研究中心合作&#xff0c;在江苏溧阳市成立联合研究中心&#xff0c;专注于固态电池和钠离子电池的科研。” 根据巴斯夫官方微博消息&#xff0c;新成立的研究中心名为“巴斯夫–长三角物理研究中心新能源汽车…

高德地图的使用

JS API 结合 Vue 使用 高德地图 jsapi 下载、引入 npm add amap/amap-jsapi-loaderimport AMapLoader from amap/amap-jsapi-loader 使用2.0版本的loader需要在window对象下先配置 securityJsCode JS API 安全密钥使用 JS API 使用 script 标签同步加载增加代理服务器设置…

【计算机网络】网络编程套接字(二)

文章目录 网络编程套接字&#xff08;二&#xff09;简单TCP服务器实现创建套接字服务器绑定服务器监听服务器接收连接服务器处理请求 简单TCP客户端实现创建套接字客户端发起连接客户端发起请求 服务器简单测试服务器简单测评多进程版TCP服务器捕捉SIGCHLD信号孙子进程提供服务…

【RuoYi-Cloud-Plus】学习笔记 09 - Sentinel(四)熔断降级知识整理

文章目录 前言参考目录版本说明学习笔记1、包结构2、DegradeSlot3、DegradeRule4、DegradeRuleManager5、CircuitBreaker5.1 CircuitBreaker.State6、AbstractCircuitBreaker6.1、AbstractCircuitBreaker#fromCloseToOpen6.2、AbstractCircuitBreaker#fromHalfOpenToOpen6.3、A…

支付宝接入

支付宝接入 python-alipay-sdk pycryptodome一、电脑网站支付 1.1 获取支付宝密钥 沙箱网址 1.APPID 2.应用私钥 3.支付宝公钥1.2 存放密钥 在与 settings.py 的同级目录下创建 pem 文件夹pem 文件夹下创建 app_private_key.pem 和 alipay_public_key.pem app_private_key…

神经网络初谈

文章目录 简介神经网络的发展历程神经网络的初生神经网络的第一次折戟神经网络的新生&#xff0c;Hinton携BP算法登上历史舞台命途多舛&#xff0c;神经网络的第二次寒冬神经网络的重生&#xff0c;黄袍加身&#xff0c;一步封神神经网络的未来&#xff0c;众说纷纭其他时间点 …

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063

STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 Proteus仿真小实验&#xff1a; STM32 Proteus仿真LCD12864俄罗斯方块-FZ0063 功能&#xff1a; 硬件组成&#xff1a;STM32F103R6单片机 LCD12864显示器多个按键 1.标准俄罗斯方块经典游戏玩法&#xff0c;带计时&#xff0c…

Kong 服务和路由的添加

管理服务 这里参考DB-less-Mode&#xff0c;因为使用的是yaml配置文件的形式&#xff0c;所以所有的相关配置只需要往初始化的kong.yml文件中添加就可以了&#xff0c;就像nginx的配置文件 DB-less-Mode 创建服务 vim /etc/kong/kong.yml services: - name: my-service #…

MySQL---表数据高效率查询(简述)

目录 前言 一、聚合查询 &#x1f496;聚合函数 &#x1f496;GROUP BY子句 &#x1f496;HAVING 二、联合查询 &#x1f496;内连接 &#x1f496;外连接 &#x1f496;自连接 &#x1f496;子查询 &#x1f496;合并查询 &#x1f381;博主介绍&#xff1a;博客名…