力扣 --- 45. 跳跃游戏II

2023-11-17

45. 跳跃游戏II

2020.05.04 22:58


题目描述:

给定一个非负整数数组,你最初位于数组的第一个位置。

数组中的每个元素代表你在该位置可以跳跃的最大长度。

你的目标是使用最少的跳跃次数到达数组的最后一次位置。

示例:

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

说明:假设你总是可以到达数组得最后一个位置


贪心算法–尽可能地多(贪)

题解:

解法一:倒着来,往回跳

从最后一个位置往后找,谁离我最远并且能够跳到我这里,就定位到那个位置,然后从这个位置继续往后跳,
直到跳到idx == 0结束,然后这样记录步数。
每回跳一次,步数+1
class Solution{
    //思路一:倒着来
    public int jump1(int[] nums) {
        int len = nums.length;
        int idx = len - 1;
        int steps = 0;
        //当idx到0或者比0还小的时候说明OK了
        while(idx > 0){
            //从0开始找第一个能一步跳过来的,当然是离我最远的能到我这里的
            for(int i = 0; i < idx; i++){
                if( i + nums[i] >= idx){
                    idx = i;
                    break;
                }
            }
            steps++;
        }
        return steps;
    }
}

时间复杂度O(N^2) 空间O(1)

解法二:正着来

从第一个位置开始跳,在nums[0]的范围内,去看看哪个位置能够跳得更远,那就跳到那个位置,
然后继续从那个位置又这样找,直到跳到最后一个位置。
 每跳一次,步数+1
class Solution {
    //思路二:正着来
    public int jump2(int[] nums) {
        int len = nums.length;
        int end = 0;
        int steps = 0;
        //始终去维护一个边界,就是现在能跳得范围,在这个范围里面去找跳的最远的,也就是新的边界。
        //当到达这个边界时,就会更新这个边界
        int maxStep = 0;
        for(int i = 0; i < len - 1; i++){
            maxStep = Math.max(maxStep, i + nums[i]);//找新的end边界,一定是最远的那个
            if(i == end){//如果跑到了现在的边界
                //更新边界
                end =maxStep;
                steps++;
            }
        }
        return steps;
    }
}

时间复杂度O(N) 空间O(1)

解法三:bfs

看了群里甜姨的思路,用bfs进行求解。每一层遍历完进行一次step++操作,然后用vis[]注意是否访问过的

刚开始nums[0]入队,然后poll出来,把nums[0]能跳的位置都入队。
关于如何增加步数,每遍历完一层,step++。还要用一个vis[]记录是否已经遍历过
class Solution {
    //思路三:bfs
    public int jump(int[] nums) {
        int len = nums.length;
        if(len == 1){
            return 0;
        }
        Queue<Integer> queue = new LinkedList<>();
        boolean[] vis = new boolean[len];
        queue.add(0);//将第一个入队
        vis[0] = true;
        int steps = 0;
        while(!queue.isEmpty()){
            //将这一层的全部遍历完
            steps++;
            int size = queue.size();
            for(int i = 0; i < size; i++){
                int idx = queue.poll();
                for(int j = nums[idx]; j > 0 ; j--){
                    if(j + idx >= len - 1){
                        return steps;
                    }
                    if(!vis[j + idx]){  
                        vis[j + idx] = true;
                        queue.add(j + idx); 
                    }
                }
            }   
        }
        return steps;
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

力扣 --- 45. 跳跃游戏II 的相关文章

  • 在 Java Swing 中检测 JScrollPane 上的 mouseClick 事件

    如果我有这样的东西 我可以使用布尔标志 performAdjustment 控制自动滚动 static boolean performAdjustment true JTextArea textArea new JTextArea JScr
  • 如何在java swing中的每个页面中打印带有页脚的整个JPanel

    好吧 这可能很简单 但想不通 我有一个包含 JTable 的 JPanel JTable 包含很少的行 有时更多 因为我推入其中的表模型取决于数据库 但是 我不使用任何包含 JTable 的 JScolpane 因此 当 JTable 包含
  • JPanel透明背景和显示元素[重复]

    这个问题在这里已经有答案了 我插入一个背景图e 变成 aJPanel但一些界面元素消失了 以下 Java Swing 元素不会出现 标签标题 标签 usuario 标签 密码 按钮加速器 你能否使图像透明或元素不透明 setOpaque f
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • Spring webflow 应用程序:HTTP 302 暂时移动

    我的 java 应用程序中的每个请求都会生成另外 2 个带有 HTTP 302 错误的请求 例如 如果请求查看名为板 html 这个请求是从首页 html 我收到按以下顺序生成的 3 个请求 POST home html 302 Moved
  • JUnit Eclipse 显示 System.out.print() 的

    我正在使用 JUnit 3 和 Eclipse 3 4 当我运行 JUnit 测试用例时 一切正常并且测试完美完成 唯一的事情是我想查看我正在运行的类的输出 所有类都具有一些输出值的基本 System out print 因此 当我运行测试
  • java“void”和“非void”构造函数

    我用 java 编写了这个简单的类 只是为了测试它的一些功能 public class class1 public static Integer value 0 public class1 da public int da class1 v
  • 如何解决错误:java.lang.ClassNotFoundException:io.netty.util.concurrent.GenericFutureListener?

    昨天我第一次尝试用 Java 制作 Prometheus 客户端 从 Python 开始 最后是 GoLang 是否找到示例 import io prometheus client Counter import io prometheus
  • Maven 多模块项目结构问题

    自从过去几周构建我的 Maven 多模块项目以来 这是我的一次有趣的经历 当我决定使用 Maven 进行构建生命周期管理时 我有几个原因希望选择 Maven A 大多数开发团队都是分开的 这样每个团队都可以在项目中的单独模块上工作 例如团队
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • 会话 bean 中的 EntityManager 异常处理

    我有一个托管无状态会话 bean 其中注入了 EntityManager em 我想做的是拥有一个具有唯一列的数据库表 然后我运行一些尝试插入实体的算法 但是 如果实体存在 它将更新它或跳过它 我想要这样的东西 try em persist
  • 在 Mac 上使用 JRE 打开 jar 文件

    我有一个 jar 文件 旨在通过命令行运行 我不打算在运行应用程序的机器上进行任何java开发 我的思考过程是 因此我应该只需要JRE而不是JDK 此外 JDK 大约是 JRE 的 4 倍 我不想下载它 在 Mac 上安装 JRE 时 它不
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • Java G1 GC 处理引用对象运行缓慢

    我已经在 J ava 上运行了计数器 它24小时工作 每秒点击通过100次左右 白天 GC 处理时间从 20 60 毫秒缓慢上升到 10000 60000 毫秒 然后下降到 20 60 毫秒 这种模式不时地重复 从 GC 日志中我发现 GC
  • 嵌入式 tomcat 7 servlet 3.0 注释不起作用

    我有一个精简的测试项目 其中包含 Servlet 版本 3 0 用注释声明 如下所示 WebServlet test public class TestServlet extends HttpServlet private static f
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • Scala repl 抛出错误

    当我打字时scala在终端上启动 repl 它会抛出此错误 scala gt init error error while loading AnnotatedElement class file usr lib jvm java 8 ora
  • Android 中的字符串加密

    我正在使用代码进行加密和加密 它没有给出字符串结果 字节数组未转换为字符串 我几乎尝试了所有方法将字节数组转换为字符 但没有给出结果 public class EncryptionTest extends Activity EditText
  • JDK 7 的快速调试/调试构建

    我正在寻找 JDK 的调试 或者我猜他们称之为快速调试构建 以启用在运行时生成的打印程序集以及查找性能问题时所需的其他诊断 就目前情况而言 我似乎找不到可以直接使用的 现成的 快速调试构建二进制包 有人可以帮我提供下载链接 或者至少提供有关
  • 如何在Java中跨类共享变量,我尝试了静态不起作用

    类 Testclass1 有一个变量 有一些执行会改变变量的值 现在在同一个包中有类 Testclass2 我将如何访问 Testclass2 中变量的更新值 由 Testclass1 更新 试过这个没用 注意 Testclass1和Tes

随机推荐

  • Idea中Springboot开启热部署方法

    Springboot1 3后支持热部署 具体方法如下 1 增加依赖
  • 【Java学习笔记】70:借助Redis实现分布式锁

    这节学习Java用Redis做分布式锁 来做秒杀场景卖货减库存的案例 最原始的减库存写法 这里库存也存Redis里面 调减库存接口的时候判断一下大于0 还有库存 就拿出来减1 这里StringRedisTemplate是Spring Boo
  • elasticsearch的映射 (mapping)

    一 概念 映射 mapping 就是指定索引 index 里面的每个文档中的字段的类型 设置字段的存储和查询的分析策略 es对不同的字段类型 有不同的存储和检索策略 比如对于text类型的字段 会经过各类分词处理 大小写转换 同义词转换 才
  • VTK5.10.1+Cmake+vs2010整合安装

    1 下载 VS2010就自己在网上找了咯 这里不提供具体路径下载了 vtk 5 10 1 zip源程序 vtkdata 5 10 1 zip 数据 vtkDocHtml 5 10 1 tar gz 文档可以不下载 vtk相关安装程序下载 h
  • MySQL基础高频面试题

    1 什么是索引 索引是一种用于快速查询和检索数据的数据结构 mysql中的索引结构有 B 树和Hash 索引的作用就相当于目录的作用 我们只需要先去目录里查找字的位置 然后直接翻到那一页就行了 这样查找就会非常快 2 索引的优缺点 优点 1
  • JavaWeb之HTML和CSS

    标签命令汇总 tr 行 td 单元格 b 加粗 font 字体标签 br 换行 a 超链接标签 ul 无序标签列表 ol 有序标签列表 li list ul 无序标签列表 href 设置链接地址 一 概述 1 B S软件结构 JavaSE中
  • 欧拉习题40

    题目如下 An irrational decimal fraction is created by concatenating the positive integers 0 12345678910111213141516171819202
  • CVPR-2022- MixFormer: End-to-End Tracking with Iterative Mixed Attention 阅读笔记

    目录 端到端的MixFormer跟踪整体框架 Mixed attention module MAM 基于角的定位头 基于查询的定位头 分数预测模块 SPM 论文地址 https arxiv org abs 2203 11082 代码地址 h
  • Java对象的序列化和反序列化实践

    当两个进程在进行远程通信时 彼此可以发送各种类型的数据 无论是何种类型的数据 都会以二进制序列的形式在网络上传送 发送方需要把这个Java对象转换为字节序列 才能在网络上传送 接收方则需要把字节序列再恢复为Java对象 把Java对象转换为
  • OrCAD打开工程报错-ERROR(ORCAP-1653)

    OrCAD打开工程报错 ERROR ORCAP 1653 OrCAD打开工程报错 ERROR ORCAP 1653 1 简要介绍 2 报错原因 3 解决方法 1 简要介绍 长期使用 OrCAD 以来都比较顺手 不知什么时候开始打开某些原理图
  • 解决hikari连接池一段时间不操作断开连接的问题

    起因 在自己项目中隔一段时间不操作数据库就会报错导致数据库连不上 报错信息 报错信息显示30207ms 差不多是30s 主要原因是因为我是用的SpringBoot版本使用的连接池是hikari 由其中一个属性connectionTimeou
  • Endnote 与word关联

    适用于endnotex7 endnotex8 endnotex9和office2019 office2021 第一步 打开Word 选择 选项 单击转到下一页 第二步 选择 加载项 COM加载项 转到 进入下一页 第三步 添加 可用加载项
  • python中.find函数的使用方法及实例_Python

    re findall findall string pos endpos 在字符串中找到正则表达式所匹配的所有子串 并返回一个列表 如果没有找到匹配的 则返回空列表 string 待匹配的字符串 pos 可选参数 指定字符串的起始位置 默认
  • [从零开始学DeepFaceLab-7]: 使用-命令行八大操作步骤-第4步:从目标图片中提取所需图片

    目录 总体流程 步骤4 从源片中提取脸部图片 4 1 命令 4 data src faceset extract MANUAL bat 不推荐使用
  • ElementUI浅尝辄止25:MessageBox 弹框

    模拟系统的消息提示框而实现的一套模态对话框组件 用于消息提示 确认消息和提交内容 从场景上说 MessageBox 的作用是美化系统自带的 alert confirm 和 prompt 因此适合展示较为简单的内容 如果需要弹出较为复杂的内容
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • win7安装了vc++6.0打开已保存文件项目就会崩溃

    我用win7安装了vc 6 0的英文完整版 绿色中文版 发现当运行程序时 要打开已保存文件项目就会崩溃 系统对话筐就说 Microsoft R Developer Studio已停止工作 选择调试或者关闭 office 2010 与vc 6
  • C++ 中只能在堆或栈上创建的对象

    1 只能在堆上创建的对象 1 把析构函数声明为private 2 定义一个destroy 函数 用这个函数来delete对象 void destroy delete this 2 只能在栈上创建的对象 1 覆盖operator new 和
  • 区块链数据不可篡改的详细解释

    区块链数据不可篡改的详细解释 背景介绍 本人新人一枚 学习区块链的过程中 在网上看到了很多讨论区块链区块数据不可篡改的文章 以比特币为例哈 主要存在2种解释 解释1 由于哈希指针的存在 假设存在某节点修改的了当前区块数据 带来的后果就是其后
  • 力扣 --- 45. 跳跃游戏II

    45 跳跃游戏II 2020 05 04 22 58 题目描述 给定一个非负整数数组 你最初位于数组的第一个位置 数组中的每个元素代表你在该位置可以跳跃的最大长度 你的目标是使用最少的跳跃次数到达数组的最后一次位置 示例 输入 2 3 1