【LeetCode 热题 100】55. 跳跃游戏

Problem: 55. 跳跃游戏
给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

文章目录

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

整体思路

这段代码旨在解决经典的 “跳跃游戏” (Jump Game) 问题。问题要求判断给定一个非负整数数组,你是否能够从第一个索引(位置0)开始,最终到达数组的最后一个索引。数组中的每个元素代表你在该位置可以跳跃的最大长度。

该算法采用了一种非常高效且直观的 贪心算法 (Greedy Algorithm)。其核心思想不是去模拟每一步具体的跳跃,而是去维护一个当前可到达的最远距离

算法的逻辑步骤如下:

  1. 维护一个“可达范围”

    • 算法使用一个变量 maxLoc 来记录从起点(索引0)出发,通过已经访问过的所有位置,能够到达的最远索引。
    • maxLoc 初始化为 0,因为我们最初就站在索引 0 的位置。
  2. 遍历与检查

    • 算法通过一个 for 循环,从左到右遍历数组的每一个位置 i
    • 核心检查(可达性判断):在循环的每一步,首先检查当前位置 i 是否在之前计算出的 maxLoc 的覆盖范围之内。即 if (i > maxLoc)
      • 如果 i > maxLoc,这意味着当前位置 i 根本无法从任何前面的位置跳跃到达。就好像河流中间断了一截,我们永远也到不了对岸。在这种情况下,我们不可能到达数组的末尾,因此直接返回 false
    • 贪心更新(扩展范围):如果当前位置 i 是可达的,我们就利用这个位置的跳跃能力来尝试扩展我们的“可达范围”。
      • 从位置 i 出发,最远可以跳到 i + nums[i]
      • 我们将这个新的可达距离与已知的最远距离 maxLoc 进行比较,并更新 maxLoc 为两者中的较大值。即 maxLoc = Math.max(maxLoc, i + nums[i])
      • 这个贪心的选择在于,我们总是希望把我们能到达的边界推得尽可能远。
  3. 最终结果

    • 如果循环能够顺利完成(即从未触发 i > maxLoc 的条件),这意味着数组的每一个位置(包括最后一个位置 n-1)都在我们的可达范围之内。
    • 因此,只要循环能走完,就说明最后一个位置是可达的,返回 true

完整代码

class Solution {/*** 判断是否能从数组的第一个位置跳到最后一个位置。* @param nums 数组,每个元素代表在该位置的最大跳跃长度。* @return 如果可以到达最后一个位置,则返回 true,否则返回 false。*/public boolean canJump(int[] nums) {int n = nums.length;// maxLoc: 记录从起点出发,当前能够到达的最远位置的索引。// 这是一个贪心选择,我们总是希望这个值越大越好。int maxLoc = 0;// 遍历数组的每一个位置,i 代表当前位置的索引。for (int i = 0; i < n; i++) {// 核心判断:检查当前位置 i 是否可达。// 如果当前位置 i 已经超出了之前所有位置能够到达的最远距离 maxLoc,// 说明 i 这个位置是无论如何也无法到达的,因此直接返回 false。if (i > maxLoc) {return false;}// 贪心更新:更新能够到达的最远位置。// 从当前位置 i 出发,最远可以跳到 i + nums[i]。// 我们取这个新值与已知的最远位置 maxLoc 中的较大者,作为新的最远可达距离。maxLoc = Math.max(maxLoc, i + nums[i]);// 一个小优化:如果 maxLoc 已经能覆盖或超过最后一个位置,就可以提前结束了。// if (maxLoc >= n - 1) {//     return true;// }}// 如果循环能够顺利完成,意味着数组的最后一个位置(n-1)也是可达的// (因为它没有在 if (i > maxLoc) 中被拦截),因此返回 true。return true;}
}

时空复杂度

时间复杂度:O(N)

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

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

空间复杂度:O(1)

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

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

参考灵神

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

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

相关文章

Java-JVM是什么JVM的类加载机制

一.JVM是什么1.jvm是java虚拟机&#xff0c;是java程序运行的基础环境2.jvm运行的是java源代码经过编译后的class文件&#xff0c;这些class文件经过jvm负责解释或即时编译为对应平台的机器码并执行3.class文件也可以通过其他【jvm languages】经过编译后得到&#xff0c;例如s…

做亚马逊广告,有哪些提高效率的工具

"为什么每天花3小时调整广告却看不到效果&#xff1f;""如何避免高转化关键词被竞争对手抢走&#xff1f;""为什么手动调整预算总是慢市场半拍&#xff1f;""ACOS居高不下真的是关键词选错了吗&#xff1f;""有没有工具能真正实现…

研究学习3DGS的顺序

6 个核心基础模块 序号模块说明推荐学习顺序1&#x1f4f7; 三维计算机视觉基础建立对3D场景、点云、体积的空间理解✅第一个2&#x1f9ee; CT成像原理与图像表示理解CT图像本质、断层数据、密度单位✅并行进行3&#x1f7e1; NeRF与3D Gaussian Splatting原理掌握点云/高斯场…

期刊分类计算机领域会议

该图片已上传图床&#xff0c;需要可自行下载&#xff1a; https://youke1.picui.cn/s1/2025/08/15/689f1e3553930.png 参考链接&#xff1a; 【干货】最全学术期刊级别分类讲解_哔哩哔哩_bilibili

【计算机视觉与深度学习实战】01基于直方图优化的图像去雾技术

摘要 随着计算机视觉技术的快速发展,图像去雾已成为数字图像处理领域的重要研究方向。雾霾、灰尘、水汽等环境因素会严重降低图像的对比度和可见度,影响图像的视觉效果和后续的计算机视觉任务。本文深入探讨了基于直方图优化的图像去雾技术,包括全局直方图均衡化、对比度限…

Vue3 + Axios 实现一个精美天气组件(含实时与未来预报)

Vue3 Axios 实现一个精美天气组件&#xff08;含实时与未来预报&#xff09; 一、前言 在很多管理系统、信息看板、门户首页中&#xff0c;天气模块是一个常见的小组件。 它不仅能展示当前的气温、天气状况&#xff0c;还能提供未来几天的天气趋势&#xff0c;让用户对环境有…

Unity:GUI笔记(二)——工具栏和选择网格、滚动列表和分组、窗口、自定义皮肤样式、自动布局

写在前面&#xff1a;写本系列(自用)的目的是回顾已经学过的知识、记录新学习的知识或是记录心得理解&#xff0c;方便自己以后快速复习&#xff0c;减少遗忘。五、工具栏和选择网格1、工具栏使用Unity提供的API&#xff1a;GUI.Toolbar()可以创建一个工具栏。有三个参数是必须…

Streamlit实现Qwen对话机器人

Web界面 一、Streamlit 是一个用于创建数据科学和机器学习应用的开源前端框架&#xff0c;能够快速将 Python 脚本转化为交互式 Web 应用。通过简单的 Python API 就能构建出交互式的数据应用。 1、主要特点 简单易用&#xff1a;纯 Python 编写代码&#xff0c;API 简洁直观…

Linux-地址空间

目录 1.介绍 2.理解 3.Linux早期的内核调度队列 1.介绍 这是32位的程序空间地址图&#xff1a; 为了更好地理解这段图&#xff0c;我们来写一段代码编译运行&#xff1a; #include <stdio.h> #include <string.h> #include <unistd.h> #include <std…

**标题:发散创新之力,探索隐私计算的未来**隐私计算,作为当下数字化时代的热门话题,正受

标题&#xff1a;发散创新之力&#xff0c;探索隐私计算的未来 隐私计算&#xff0c;作为当下数字化时代的热门话题&#xff0c;正受到越来越多开发者和从业者的关注。本文将带您走进隐私计算的奇妙世界&#xff0c;探讨其背后的技术原理、应用场景以及发展趋势。 一、隐私计算…

线程P5 | 单例模式[线程安全版]~懒汉 + 饿汉

什么是单例模式&#xff1f;在我们正式讲解单例模式之前&#xff0c;没有了解过的小伙伴可能会有疑问...到底啥叫单例模式&#xff1f;&#xff1f;其实单例模式呢&#xff0c;是我们设计模式中的一种&#xff0c;所谓的设计模式&#xff0c;你可以把它理解为一个模板&#xff…

kubernetes中数据存储etcd

etcd 在 Kubernetes 中的角色核心定位&#xff1a;Kubernetes 的 唯一持久化数据存储&#xff08;一致性数据库&#xff09;。职责&#xff1a; 保存整个集群的期望状态&#xff08;desired state&#xff09;&#xff0c;包括节点信息、Pod 清单、Service 定义、ConfigMap、Se…

Linux crontab定时任务

参考资料 【図解】cronの仕組み定时任务 - crontab解决ubuntu下定时任务不执行问题crontab环境变量问题&#x1f4a5;Linux定时任务功能详解&#xff1a;crontab与at命令应用指南 目录一. 环境准备1.1 wsl开启systemd1.2 开启cron日志二. cron服务管理相关命令2.1 service 的方…

企业频繁收到软件律师函?如何彻底解决这一难题

1. 引言&#xff1a;律师函频发&#xff0c;已成信息化管理的“隐形雷区”在工业制造、芯片、航空航天、船舶制造、医疗器械等高要求行业&#xff0c;软件不仅是研发与生产的关键工具&#xff0c;更是企业数据与知识产权安全的“底座”。然而&#xff0c;不少企业却在日常运营中…

在 macOS 上顺利安装 lapsolver

一、什么是 lapsolver&#xff1f; lapsolver 是一个用于求解线性分配问题&#xff08;Linear Assignment Problem, LAP&#xff09; 的 Python 库。线性分配问题是运筹学中的经典问题&#xff0c;核心是在两个集合&#xff08;如“工人”与“任务”&#xff09;之间找到一组最…

宋红康 JVM 笔记 Day02|JVM的架构模型、生命周期、发展历程

一、今日视频区间 P13-P25 二、一句话总结 JVM的架构模型&#xff1b;JVM的生命周期&#xff1b;JVM发展历程&#xff1b; 三、关键图/命令 3.1 JVM的架构模型Java程序对.class字节码文件进行反编译操作&#xff1a;在idea中先运行需要反编译的代码&#xff0c;找到对应的字节码…

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用

Linux新手上路 | 在Ubuntu上Pluma文本编辑器的安装与基本使用一、Pluma工具介绍1.1 Pluma 工具概述1.2 主要功能1.3 适用场景二、安装Pluma2.1 安装方法2.2 启动Pluma工具三、汉化方法3.1 安装汉化包3.2 设置系统语言3.3 重新打开Pluma四、基本使用方法4.1 编写文本内容4.2 关键…

React 揭秘:从新手到高手的进阶之路

目录 React&#xff1a;前端开发新宠​ React 初相识​ 什么是 React​ React 的核心特性​ 1.组件化开发 2.虚拟 DOM 与 Diff 算法 单向数据流 搭建 React 开发环境 环境准备​ 创建 React 项目 项目结构解析 React 基础语法与核心概念 JSX 语法​ 基本语法规则…

八股文小记 Servlet 过滤器-Spring MVC 拦截器-Spring AOP 拦截器区别

您对执行机制的洞察非常准确&#xff01;让我们深入分析这三种组件的调用机制及其与 AOP 节点的关系&#xff1a; 一、执行机制的本质区别组件调用机制实现原理Servlet 过滤器递归调用通过 FilterChain.doFilter() 显式递归调用下一个节点Spring MVC 拦截器遍历调用由 HandlerE…

qml 实现数值键盘

import QtQuick 2.0import QtQuick.Layouts 1.12 import"../pad" // PasswordKeyboard.qml import QtQuick 2.12ColumnLayout {id: keyboardspacing: 8// 键盘标题Text {text: "安全输入"font.pixelSize: 16color: "#666"Layout.alignment: Qt.A…