力扣45.跳跃游戏Ⅱ(贪心思路详解)

news2024/11/18 4:33:20

文章目录

  • 力扣45.跳跃游戏Ⅱ
    • 题目描述
    • 算法思路
    • 代码实现

力扣45.跳跃游戏Ⅱ


题目描述

给定一个长度为 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


算法思路

算法一,反向查找出位置(很好理解)
从最后一个位置开始遍历,并选定该位置作为目标位置,然后从前向后查找出第一个能跳到这个位置的位置,即距离目标位置最远的位置,作为上一跳的起跳位置,然后更新这个起跳位置为目标位置,再选定这个新的目标位置,继续从前往后查找,找到距离这个新目标位置最远的起跳位置,且该起跳位置保证可以跳到新的目标位置,重复该过程直到使起跳位置变成第一个位置,返回步数。

最坏时间复杂度O(n^2)


算法二,贪心:
大体思路是,正向查找,从前向后遍历,每次找到能跳得最远的位置。
例如,对于数组 [2,3,1,2,4,2,3],初始位置是下标 0,从下标 0 出发,最远可到达下标 2。下标 0 可到达的位置中,下标 1 的值是 3,从下标 1 出发可以达到更远的位置,因此第一步到达下标 1。
从下标 1 出发,最远可到达下标 4。下标 1 可到达的位置中,下标 4 的值是 4 ,从下标 4 出发可以达到更远的位置,因此第二步到达下标 4。

具体实现的细节思想如下:

  • maxPos代表从当前位置跳,所能跳到的位置中,下一跳能达到最远距离的位置
  • end代表从当前位置跳能跳到的最远边界范围,起始情况下可以看作当前位置为-1
  • step代表当前跳的跳数
  • 我们从位置-1,第step=0跳开始,每一次的任务是选定下一条的起跳位置,位置i代表我们第step+1跳的起跳预选位置
  • 选定起跳位置的范围是当前位置所能跳到的最远边界内
  • 其中第1跳只能从位置0开始起跳,因为第1跳起跳的预选位置中,我们从起始位置-1开始只能跳到位置0,所以0就是边界,即end=0

时间复杂度O(n)


代码实现

算法一:

int jump(int* nums, int numsSize){
    int i=numsSize-1,j,step=0;
    while(i>0)
    {
      for(j=0;j<i;j++)
      {
          if(i-j<=nums[j]) 
          {
              i=j;
             step++;
              break;
          }
      }
    }
    return step;
}

在这里插入图片描述


算法二:

int jump(int* nums, int numsSize){
    int maxPos = 0,end = 0, step = 0;
 // maxPos代表从当前位置跳,所能跳到的数中,下一跳能达到最远距离的位置
 // end代表从当前位置跳能跳到的最远边界范围,起始情况下可以看作当前位置为-1
 // step代表当前跳的跳数
        for (int i = 0; i < numsSize - 1; ++i)//遍历每一个位置
         {
                maxPos = maxPos>i + nums[i]?maxPos:i+nums[i];//更新下一跳的最远距离
                if (i == end) //遍历位置到达边界
                {
                    end = maxPos;//更新边界
                    ++step;
                }
        }
        return step;
    }

在这里插入图片描述

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

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

相关文章

114、【树与二叉树】leetcode ——77. 组合:回溯法+剪枝优化(C++版本)

题目描述 原题链接&#xff1a;77. 组合 解题思路 组合问题是回溯法里的经典问题&#xff0c;分别采用两个全局变量path记录当前组合情况&#xff0c;res作为结果集。每次因为结果集需要去重&#xff0c;因此还需要再设置一个局部变量startIndex作为每次遍历的起始值&#xf…

Linux kernel Memory Pin机制的实现以及测试

提起Memory Pin机制&#xff0c;就不得不提到swap的概念&#xff0c;这两个概念息息相关&#xff0c;为了避免在CPU忙碌的时候&#xff0c;也就是在缺页异常发生的时候&#xff0c;临时搜索可供换出的内存页面并加以换出&#xff0c;Linux内核定期地检查系统的空闲页面数量是否…

九大数据分析方法-单指标分析方法与多指标分析方法

文章目录1 单指标分析方法1.1 周期性分析法1.2 结构分析法1.3 分层分析法2 多指标分析方法2.1 矩阵分析法2.2 指标拆解法本文来源&#xff0c;为接地气的陈老师的知识星球&#xff0c;以及付同学的观看笔记。1 单指标分析方法 顾名思义&#xff0c;用单个数据指标进行数据分析…

RocketMQ 简介

一、简介 官方简介&#xff1a; l RocketMQ是一款分布式、队列模型的消息中间件&#xff0c;具有以下特点&#xff1a; l 能够保证严格的消息顺序 l 提供丰富的消息拉取模式 l 高效的订阅者水平扩展能力 l 实时的消息订阅机制 l 亿级消息堆积能力 二、网络架构 三、特性 1. na…

05-jquery基本过滤器

2.5过滤器 过滤器是一个字符串&#xff0c;用了筛选dom对象&#xff0c;过滤器是和选择器一起使用。在选择dom对象后&#xff0c;再进行过滤筛选。 .5.1基本过滤器 使用dom对象在数组中的位置&#xff0c;作为过滤条件。 1 选择数组中第一个dom成员。 语法&#xff1a;$(“选…

【nginx】全面实战-Mac

▒ 目录 ▒&#x1f6eb; 导读需求1️⃣ 安装brew替换为阿里源修复报错No such file or directorybrew install nginx常用文件及目录常用命令2️⃣ nginx配置配置结构3️⃣ web服务器默认服务器自定义静态服务器4️⃣ 反向代理配置及介绍5️⃣ 负载均衡配置及介绍负载均衡的策略…

杂记:python和pyinstaller从头安装步骤(附安装包的备份)

pyinstaller 简介 知道的就跳过本章 python 属于脚本语言&#xff0c;只要有 python 就能运行 .py 文件。而 pyinstaller 是可执行文件文件生成工具&#xff0c;约等于编译工具。 以 windows 为例&#xff0c;在 A 计算机上生成的 exe&#xff0c;复制到 B 计算机可以直接运行…

字节跳动青训营--前端day3

文章目录前言一、写好JavaScript的一些原则二、各司其职三、组件封装四、过程抽象前言 仅以此文章记录学习 一、写好JavaScript的一些原则 各司其职&#xff1a;让HTML、CSS和JavaScript职能分离组件封装&#xff1a;好的UI组件具备正确性、扩展性、复用性过程抽象&#xff1…

JVM堆内存分配策略(深入理解Java虚拟机第三章)

堆内存模型&#xff1a; 年轻代&#xff1a; 根据分代算法&#xff0c;默认小于15岁的对象称作年轻代&#xff0c;年轻代分为Eden区、幸存者区(Survivor Form&#xff0c;Survivor To),三者比例为&#xff1a;8&#xff1a;1&#xff1a;1 Eden 分区&#xff1a;对象出生分区…

Java 实现几种 异步的实现方式

前言 异步执行对于开发者来说并不陌生&#xff0c;在实际的开发过程中&#xff0c;很多场景多会使用到异步&#xff0c;相比同步执行&#xff0c;异步可以大大缩短请求链路耗时时间&#xff0c;比如&#xff1a;发送短信、邮件、异步更新等&#xff0c;这些都是典型的可以通过…

FL水果21最新版本电脑编曲软件FL Studio更新

电脑编曲软件也就是我们常说的宿主软件&#xff0c;英文简称DAW。 FL Studio俗称水果&#xff0c;是一款开发初衷为了电子音乐制作的宿主软件。内置了非常多优秀的合成器以及效果器插件&#xff0c;极为适合于电子音乐的编排。同时FL Studio支持第三方音源插件导入&#xff0c;…

[RootersCTF2019]ImgXweb

目录 信息收集 JWT伪造 工具使用 寻找秘钥 curl 补充知识 信息收集 进入查看源码未发现重要信息 注册admin失败&#xff0c;猜测应该需要垂直越权 先随意注册个账户coleak 登录后发现可以文件上传&#xff0c;上传shell后发现不能连接&#xff0c;执行命令也没有回显…

Linux常用命令——tailf命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tailf 在屏幕上显示指定文件的末尾若干行内容&#xff0c;通常用于日志文件的跟踪输出。 补充说明 tailf命令几乎等同于tail -f&#xff0c;严格说来应该与tail --followname更相似些。当文件改名之后它也能继…

微服务注册中心-Eureka

微服务注册中心-Eureka微服务注册中心-Eureka一、注册中心&#xff08;Eureka&#xff09;二、Euraka实现1.eureka-server端&#xff08;1&#xff09;新建项目&#xff0c;引入pom依赖&#xff08;2&#xff09;编写启动类&#xff0c;引入开启注册中心的注解&#xff08;3&am…

py第八章 面向对象 笔记

8.1类与对象的基础运用类是抽象的&#xff0c;对象是类的实例8.1.1类的定义class 类名:属性名属性值def 方法名(self):方法体类名:大驼峰命名法&#xff1a;首字母一般为大写方法参数列表中的第一个参数是一个指代对象的默认参数selfclass Car:wheels4def drive(self):print(行…

非常好用,绝对未来黑马的 Python 开源测试框架 PySimpleTest

非常好用&#xff0c;绝对未来黑马的 Python 开源测试框架 PySimpleTest 简单介绍 PySimpleTest 是一个非常简洁开源的python代码测试框架&#xff0c;作者是 https://github.com/Time-Coder?tabstars 你可以在以下网站找到PyPI索引&#xff1a;https://pypi.org/project/P…

CSS 排行榜

CSS 排行榜 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>排行榜</title><style type"text/css">* {margin: 0;padding: 0;}/* 容器 */.rank-container {width: 400px;color: #333;font-size: 14p…

go 常用命令

巩固学习最好的方法是通过go help看文档 GO语言规范文档 终端执行命令 go help environment GOBIN The directory where ‘go install’ will install a command. go 命令使用 go <command> [arguments]command&#xff1a; The commands are:bug start a b…

十、MySQL 聚合函数、分组查询及过滤分组

文章目录一、聚合函数1.1 COUNT()函数1.2 SUM()函数1.3 AVG()函数1.4 MAX()函数1.5 MIN()函数二、分组查询及过滤分组2.1 创建分组2.2 使用HAVING过滤分组2.3 WHERE和HAVING的对比前置知识&#xff1a; 一、数据库开发与实战专栏导学及数据库基础概念入门 二、MySQL 介绍及 MyS…

你知道这些快捷键吗?

今天就给大家带来常用的电脑快捷键&#xff0c;让你的办公和学习效率加倍&#xff0c;一起来看看吧&#xff01; 快捷键一&#xff1a;快速切换窗口 想要快速切换电脑正在使用的窗口程序&#xff0c;就可以使用“AltTab”键即可快速切换。先按住“Alt”按键&#xff0c;再按“T…