Problem: 45. 跳跃游戏 II
给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。
每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在索引 i 处,你可以跳转到任意 (i + j) 处:
0 <= j <= nums[i] 且
i + j < n
返回到达 n - 1 的最小跳跃次数。测试用例保证可以到达 n - 1。

文章目录

  • 整体思路
  • 完整代码
  • 时空复杂度
    • 时间复杂度:O(N)
    • 空间复杂度:O(1)

整体思路

这段代码旨在解决经典的 “跳跃游戏 II” (Jump Game II) 问题。与判断“能否到达”的第一代问题不同,此问题要求在假设总能到达终点的前提下,计算出到达数组最后一个位置所需的 最小跳跃次数

该算法采用了一种非常高效的 贪心算法,其思想可以类比为 广度优先搜索 (BFS)。它不是关注每一步具体跳到哪里,而是在每一“跳”的范围内,寻找下一“跳”能到达的最远距离。

算法的逻辑步骤如下:

  1. 定义边界

    • 算法使用两个核心变量来定义跳跃的边界:
      • curRight当前这一跳所能到达的最远边界。可以理解为 BFS 中当前层的右边界。
      • nxtRight:从当前层(0curRight 之间的所有位置)出发,下一跳所能到达的最远边界。
    • ans 变量用于累计跳跃的次数。
  2. 贪心遍历

    • 算法通过一个 for 循环遍历数组。循环的终止条件是 i < nums.length - 1,这一点非常关键,因为我们只需要考虑从倒数第二个位置(或之前)起跳的情况,一旦到达或越过最后一个位置,就不需要再跳了。
    • 在当前跳跃范围内寻找最优的下一步:在循环的每一步(i0curRight),我们都在当前可达的范围内。对于每个位置 i,我们计算从它出发能跳到的最远距离 nums[i] + i。然后,我们用这个值去贪心地更新 nxtRight (nxtRight = Math.max(nxtRight, nums[i] + i))。这确保了 nxtRight 始终记录着从当前这一跳的覆盖范围内,能为下一跳创造的最远落点。
    • 执行跳跃:当循环变量 i 到达了 curRight 的边界时,意味着我们已经遍历完了当前这一跳能到达的所有位置。此时,我们必须执行一次跳跃才能继续前进。
      • if (i == curRight) 这个条件就是“执行跳跃”的触发器。
      • 当触发时,我们将 curRight 更新为 nxtRight,这相当于进入了 BFS 的下一层,设定了新的、更远的可达边界。
      • 同时,我们将跳跃次数 ans 加一。
  3. 返回结果

    • 当循环结束时,ans 中就记录了到达终点所需的最小跳跃次数。

完整代码

class Solution {/*** 计算到达数组最后一个位置所需的最小跳跃次数。* @param nums 数组,每个元素代表在该位置的最大跳跃长度。* @return 最小跳跃次数*/public int jump(int[] nums) {// curRight: 当前这一跳能够到达的最远右边界。int curRight = 0;// nxtRight: 在当前跳跃的覆盖范围内,下一步能够到达的最远右边界。int nxtRight = 0;// ans: 记录跳跃的次数,即结果。int ans = 0;// 遍历数组。循环到倒数第二个元素即可,因为我们的目标是“到达”最后一个位置,// 而不是从最后一个位置起跳。for (int i = 0; i < nums.length - 1; i++) {// 贪心选择:更新下一步能到达的最远距离。// 在当前跳跃的可达范围内(i 从 0 到 curRight),// 我们不断计算从每个位置 i 出发能跳到的最远点 (nums[i] + i),// 并用它来更新 nxtRight。nxtRight = Math.max(nxtRight, nums[i] + i);// 触发跳跃的条件:当 i 到达了当前跳跃的边界。// 这意味着我们已经考察完了当前这一跳能到达的所有位置,// 必须进行一次新的跳跃才能继续前进。if (i == curRight) {// 更新当前跳跃的边界为下一步能到达的最远边界。curRight = nxtRight;// 跳跃次数加一。ans++;}}// 循环结束后,ans 即为最小跳跃次数。return ans;}
}

时空复杂度

时间复杂度:O(N)

  1. 循环:算法的核心是一个 for 循环,它从 i = 0 遍历到 nums.length - 2。这个循环最多执行 N-1 次,其中 Nnums 数组的长度。
  2. 循环内部操作
    • 在循环的每一次迭代中,执行的都是基本的 Math.max、加法、比较和赋值操作。
    • 这些操作的时间复杂度都是 O(1)

综合分析
算法由 N-1 次 O(1) 的操作组成。因此,总的时间复杂度是 (N-1) * O(1) = O(N)

空间复杂度:O(1)

  1. 主要存储开销:算法只使用了几个固定数量的整型变量(curRight, nxtRight, ans, i)。
  2. 空间大小:这些变量的数量不随输入数组 nums 的大小 N 而改变。

综合分析
算法没有使用任何与输入规模 N 成比例的额外数据结构(如新数组或哈希表)。因此,其额外辅助空间复杂度为 O(1)

参考灵神

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

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

相关文章

池式管理之线程池

1.初识线程池问&#xff1a;线程池是什么&#xff1f;答&#xff1a;维持管理一定数量的线程的池式结构。&#xff08;维持&#xff1a;线程复用 。 管理&#xff1a;没有收到任务的线程处于阻塞休眠状态不参与cpu调度 。一定数量&#xff1a;数量太多的线程会给操作系统带来线…

婴儿 3D 安睡系统专利拆解:搭扣与智能系带的锁定机制及松紧调节原理

凌晨2点&#xff0c;你盯着婴儿床里的小肉团直叹气。刚用襁褓裹成小粽子才哄睡的宝宝&#xff0c;才半小时就蹬开了裹布&#xff0c;小胳膊支棱得像只小考拉&#xff1b;你手忙脚乱想重新裹紧&#xff0c;结果越裹越松&#xff0c;裹布滑到脖子边&#xff0c;宝宝突然一个翻身&…

pandas中df.to _dict(orient=‘records‘)方法的作用和场景说明

df.to _dict(orientrecords) 是 Pandas DataFrame 的一个方法&#xff0c;用于将数据转换为字典列表格式。以下是详细解释及实例说明&#xff1a; 一、核心含义作用 将 DataFrame 的每一行转换为一个字典&#xff0c;所有字典组成一个列表。 每个字典的键&#xff08;key&#…

阿里云Anolis OS 8.6的公有云仓库源配置步骤

文章目录一、备份现有仓库配置&#xff08;防止误操作&#xff09;二、配置阿里云镜像源2.1 修改 BaseOS 仓库2.2 修改 AppStream 仓库三、清理并重建缓存四、验证配置4.1 ​检查仓库状态​&#xff1a;五、常见问题解决5.1 ​HTTP 404 错误5.2 ​网络连接问题附&#xff1a;其…

回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测

回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测 目录回归预测 | Matlab实现CNN-BiLSTM-self-Attention多变量回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 1.Matlab实现CNN-BiLSTM融合自注意力机制多变量回归预测&#xff0c;CNN-BiLSTM-self-…

103、【OS】【Nuttx】【周边】文档构建渲染:Sphinx 配置文件

【声明】本博客所有内容均为个人业余时间创作&#xff0c;所述技术案例均来自公开开源项目&#xff08;如Github&#xff0c;Apache基金会&#xff09;&#xff0c;不涉及任何企业机密或未公开技术&#xff0c;如有侵权请联系删除 背景 接之前 blog 【OS】【Nuttx】【周边】文…

转换一个python项目到moonbit,碰到报错输出:编译器对workflow.mbt文件中的类方法要求不一致的类型注解,导致无法正常编译

先上结论&#xff1a;现在是moon test的时候有很多报错&#xff0c;消不掉。问题在Trae中用GLM-4.5模型&#xff0c;转换一个python项目到moonbit&#xff0c;碰到报错输出&#xff1a;报错输出经过多次尝试修复&#xff0c;我发现这是一个MoonBit编译器的bug。编译器对workflo…

【C#补全计划】事件

一、事件的概念1. 事件是基于委托的存在&#xff0c;是委托的安全包裹&#xff0c;让委托的使用更具有安全性2. 事件是一种特殊的变量类型二、事件的使用1. 语法&#xff1a;event 委托类型 事件名;2. 使用&#xff1a;&#xff08;1&#xff09;事件是作为成员变量存在与类中&…

java内存缓存

我们在项目中会经常使Redis和Memcache,但是简单项目就没必要使用专门的缓存框架来增加系统的复杂性。用Java代码逻辑就能实现内存级别的缓存。1.定时任务线程池使用ScheduledExecutorService结合ConcurrentHashMap&#xff0c;如果你使用的是ConcurrentHashMap&#xff0c;你可…

智能工厂生产监控大屏-vue纯前端静态页面练习

学习前端还是非常有意思的&#xff0c;因为前端真的是可见即所得&#xff0c;可以做出来非常好看漂亮的页面&#xff0c;最近我就在使用前端技术 做一些大屏报表&#xff0c;在制作这些大屏报表过程中&#xff0c;又熟练的练习了自己的学到的相关的前端技术&#xff0c;接下来把…

HTTP 协议详细介绍

目录一、HTTP 的基本概念与历史演进1. 核心定义2. 历史版本演进二、HTTP 的核心工作原理1. 请求-响应模型2. 基于 TCP 的传输&#xff08;HTTP/1.1、HTTP/2&#xff09;三、HTTP 请求结构1. 请求行2. 请求头3. 请求体四、HTTP 响应结构1. 状态行2. 响应头3. 响应体五、HTTP 与 …

正则化:从过拟合到泛化的「平衡艺术」

在机器学习领域&#xff0c;有一个几乎所有从业者都会遇到的「噩梦」&#xff1a;模型在训练集上表现完美&#xff08;损失趋近于0&#xff09;&#xff0c;但在测试集上却大幅「翻车」。这种现象被称为「过拟合」&#xff08;Overfitting&#xff09;&#xff0c;它像一把双刃…

[Python 基础课程]根据描述定义一个 Person 类

人都属于人类这个物种&#xff0c;每一个人都会有姓名和年龄&#xff0c;人都可以介绍自己&#xff0c;随着时间的流逝&#xff0c;人都会增加年龄&#xff0c;每一个人都能获取到自己的物种信息。 我们的抽象过程&#xff1a; 所有的 Person 对象都应该有一个共同的属性来表示…

热门手机机型重启速度对比

以下是2023-2024年市场主流热门手机机型的重启速度对比分析&#xff0c;基于公开测试数据和用户反馈整理&#xff08;数据会因系统版本和测试环境不同存在波动&#xff09;&#xff1a;旗舰机型重启速度排名&#xff08;冷启动&#xff09;排名机型平均重启时间关键配置优化技术…

第454题.四数相加II

第454题.四数相加II 力扣题目链接(opens new window) 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) &#xff0c;使得 A[i] B[j] C[k] D[l] 0。 为了使问题简单化&#xff0c;所有的 A, B, C, D 具有相同的长度 N&#xff0c;且 0 ≤ N ≤…

力扣top100(day04-05)--堆

本文为力扣TOP100刷题笔记 笔者根据数据结构理论加上最近刷题整理了一套 数据结构理论加常用方法以下为该文章&#xff1a; 力扣外传之数据结构&#xff08;一篇文章搞定数据结构&#xff09; 215. 数组中的第K个最大元素 class Solution {// 快速选择递归函数int quickselect(…

CCS双轴相位偏移光源 让浅凹痕无处遁形

在工业检测中&#xff0c;浅凹痕表面检测对精度和可靠性要求极高&#xff0c;工业光源在此过程中扮演着关键角色&#xff0c;工业光源通过精准的光学设计&#xff08;角度、波长、强度&#xff09;将肉眼不可见的浅凹痕转化为可量化的光学信号&#xff0c;是实现高精度自动化检…

专题三_二分_x 的平方根

一&#xff1a;题目解释&#xff1a;返回x的算数平方根&#xff0c;如果是小数&#xff0c;则舍去小数部分&#xff0c;返回整数即可&#xff01;二&#xff1a;算法①&#xff1a;暴力从1开始求平方&#xff0c;最后要么直接找到一个值的平方为x&#xff0c;要么发现x在两个相…

Python 操作 Redis 的客户端库 redis-py

Python 操作 Redis 的客户端库 redis-py1. Installation2. Connect and test3. Connection Pools4. Redis Commands4.1. set(name, value, exNone, pxNone, nxFalse, xxFalse, keepttlFalse, getFalse, exatNone, pxatNone)4.1.1. setnx(name, value)4.1.2. setex(name, time, …

社区物业HCommunity本地部署手册

HC小区管理系统安装手动版 更多文章参考&#xff1a; http://www.homecommunity.cn/pages/hc/hcH5_cn.html 1.0 说明 很多开发不太喜欢用梓豪安装&#xff0c;希望通过手工自己安装&#xff0c;这个就需要开发人员 有一定的安装软件能力&#xff0c;比如能够自行安装mysql能…