45. 跳跃游戏 II (贪心)

news2024/11/16 7:55:41

题目链接:力扣

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

以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.coloradmin.cn/o/734910.html

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

相关文章

影视剧配音软件哪个好?几款好用的影视剧配音软件推荐

影视剧配音软件哪个好&#xff1f;几款好用的影视剧配音软件推荐 我们日常刷短视频的时候&#xff0c;经常会刷到一些影视剧相关的作品&#xff0c;特别是一些大热剧及经典剧&#xff0c;很多创作者都喜欢融入自己的解读&#xff0c;进行一些加工&#xff0c;形成一部的独一无…

STM32 Mac开发环境Clion+STM32CubeMX+ST-Link-V2

STM32 Mac开发环境ClionSTM32CubeMXST-Link-V2 也不知道什么时候买的stm32板吃灰太久&#xff0c;不会玩&#xff0c;环境之前都没搞定&#xff0c;今天又折腾一天终于可以点灯了。 安装编译器gcc brew tap ArmMbed/homebrew-formulae brew install arm-none-eabi-gccOPEN-O…

Qt提取excel表单中数据

这是一个excel表单&#xff0c;目标是把其中的数据提取出来。 文章学习自&#xff1a;QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客 程序如下&…

前端CSS

基础语法 /*CSS注释 */ CSS样式 CSS应用方式 内联式 在标签上写样式 <img src"..." style"height:100px" /><div style"color:red;">中国联通</div> 嵌入式 在head标签中写style标签 外联式 样式写到文件中&#xff0…

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

语言模型BERT理解

一、BERT概述 BERT是由Google在2018年提出的一种预训练语言模型。BERT的创新之处在于采用了双向Transformer编码器来生成上下文相关的词向量表示。 传统的单向语言模型只考虑了左侧或右侧的上下文信息&#xff0c;而BERT则同时考虑了左侧和右侧的上下文信息&#xff0c;使得生…

YOLOv5改进系列(15)——增加小目标检测层

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

手把手教您kaiber,吊炸天的AI视频生成工具

什么是Kaiber AI&#xff1f; 一种人工智能视频生成器&#xff0c;可以将图像和文字生成视频。 如何使用Kaiber AI&#xff1f; 请按照以下步骤使用 Kaiber AI&#xff1a; 前往kaiber ai注册或登录。点击右上角“创建视频”。 如果订阅的时候提示要绑定银行卡&#xff0c;则找…

Basics——指针和引用(详解)

指针和引用 1.初始化规则2.面试题 &#xff1a;引用和指针的区别是什么3.引用使用场景4.拓展 为什么C支持引用而C没有 1.初始化规则 指针和引用在初始化方面有不同的规则&#xff1a; 指针的初始化规则&#xff1a; 直接初始化&#xff1a;可以将指针初始化为指向特定变量或…

Linux系统运行时参数命令(性能监控、测试)(3)网络IO性能监控

目录 5. 网络IO性能监控5.1 性能指标5.2 网络信息5.2.1 网络配置5.2.2 套接字信息5.2.3 网络吞吐-sar命令5.2.4 连通性和延时 5.3 其他常用的网络相关命令5.3.1 telnet5.3.2 nc5.3.3 tcpdump5.3.4 lsof5.3.5 nmap 6.其他工具6.1 nmon性能监控6.2 glances系统监控 5. 网络IO性能…

Js提升:如何实现图片懒加载

知其然&#xff0c;更要知其所有然&#xff0c;在不同场景下该用什么方法&#xff0c;如何做到最优。 为什么要出现图片懒加载&#xff0c;解决了什么问题&#xff1f;除了懒加载&#xff0c;还有预加载呢&#xff1f;什么是预加载&#xff0c;怎么实现&#xff0c;相比于懒加载…

软件设计模式与体系结构-软件体系-层次软件体系结构

目录 四、层次软件体系结构简介代码两种方式的区别双向分层分层风格 VS 主程序-子过程风格&#xff1a;二者的不同层次软件体系结构的优点层次软件体系结构的缺点 课程作业 四、层次软件体系结构 层次之间存在接口&#xff0c;通过接口形成call/return的关系&#xff0c;上层是…

【内存优化】内存优化以及oom排查整体思路

linux疑难问题排查实战专栏&#xff0c;分享了作为公司专家&#xff0c;在解决内存、性能、各类死机等疑难问题的排查经验&#xff0c;认真学习可以让你在日后工作中大放光彩。 本文总结介绍了项目开发过程中oom排查和内存优化的一些方法&#xff0c;主要是从内存问题查看到堆内…

阿里云轻量服务器和ecs区别(最新更新)

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

组合模式:如何设计实现支持递归遍历的文件系统目录树结构?

组合模式跟我们之前讲的面向对象设计中的“组合关系&#xff08;通过组合来组装两个类&#xff09;”&#xff0c;完全是两码事。这里讲的“组合模式”&#xff0c;主要是用来处理树形结构数据。这里的“数据”&#xff0c;你可以简单理解为一组对象集合&#xff0c;待会我们会…

使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

文章目录 前言1. 安装所需库2. 读取 Shapefile 文件3. 可视化地图4. 用户输入坐标和清除指定区域内的图形5. 可视化删除指定区域内的图形之后的地图6. 保存为新的 Shapefile (.shp)文件完整代码及解析分析说明 测试文件地址特别说明完结 前言 在地理信息系统&#xff08;Geogra…

力扣竞赛勋章 | 排名分数计算脚本

文章目录 力扣竞赛勋章介绍竞赛评分算法脚本&#xff08;本文的重点内容&#xff09;运行结果 代码修改自&#xff1a;https://leetcode.cn/circle/discuss/6gnvEj/ 原帖子的代码无法正常运行。 力扣竞赛勋章介绍 https://leetcode.cn/circle/discuss/0fKGDu/ 如果你想知道自…

【Elasticsearch】初识elasticsearch

目录 初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术&#xff1f; 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档…

前端各种方法自我整理

Javascript方法 slice [slaɪs]切片 slice (-2)取出数组中倒数两个植变生成一个新数组 slice(0&#xff0c;3)取出数组下标0到下标3的值&#xff0c;生成新数组 includes [ɪnˈkluːdz]包含 查看数组或字符串内是否有该值&#xff0c;有返回true,无返回false 例子&#…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(十二)完结篇

今天开始使用 vue3 + ts 搭建一个项目管理的后台,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏…