LeetCode 跳跃类问题的解题技巧:跳跃游戏与最少跳跃数

LeetCode 跳跃类问题的解题技巧:跳跃游戏与最少跳跃数

在 LeetCode 中,有一类经典的题目是关于跳跃的,例如 跳跃游戏跳跃游戏 II。这些问题通常要求我们判断是否能从数组的起始位置跳跃到结束位置,或者求得最少跳跃次数。解决这类问题时,贪心算法是一个非常有效的策略。

本文将通过 跳跃游戏(Can Jump)跳跃游戏 II(Jump) 两道题目,讲解如何运用贪心算法高效地解决这类问题。


1. 跳跃游戏 (Can Jump)

题目概述:

给定一个非负整数数组 nums,数组中的每个元素代表你在该位置可以跳跃的最大长度。你从数组的第一个位置开始,判断是否能够跳跃到数组的最后一个位置。

解题思路:

贪心策略:
  • 目标:检查是否能够跳跃到最后一个位置。我们从数组的第一个元素开始,尝试不断跳跃,并跟踪当前能到达的最远位置。
  • 核心思想:我们维护一个变量 cur,表示当前能够到达的最远位置。遍历数组时,若当前位置能够跳跃的最远位置 i + nums[i] 大于 cur,则更新 cur,如果在过程中发现当前位置无法继续跳跃(即 cur 不再更新),则返回 False
关键步骤:
  1. 从第一个位置开始,初始化 cur = 0(表示当前能跳跃到的位置)。
  2. 遍历每一个位置 i,如果 i 大于 cur,则说明当前位置无法到达,返回 False
  3. 如果 i + nums[i] 大于当前的 cur,则更新 cur
  4. 如果遍历结束后,cur 能到达最后一个位置,则返回 True
代码实现:
class Solution:def canJump(self, nums: List[int]) -> bool:cur = 0  # 当前能到达的最远位置n = len(nums)for i in range(n):if i > cur:  # 如果当前位置不能到达,返回 Falsereturn Falsecur = max(cur, i + nums[i])  # 更新当前能到达的最远位置return True  # 如果遍历结束,说明能到达最后一个位置
示例:
  • 输入:nums = [2, 3, 1, 1, 4]

  • 输出:True

    解释:可以先从下标 0 跳到下标 1,再从下标 1 跳到下标 4。


2. 跳跃游戏 II (Jump)

题目概述:

nums 数组中,每个元素代表你在该位置的最大跳跃长度。你需要返回从数组的起始位置到达最后一个位置所需的最少跳跃次数。

解题思路:

贪心策略:
  • 目标:我们需要通过最少的跳跃次数到达数组的最后一个元素。
  • 核心思想:每次跳跃时,我们选择跳得最远的点,确保每次跳跃都能覆盖尽可能多的位置。为了实现这一点,我们维护两个变量:curne
    • cur:表示当前跳跃到达的最远位置。
    • ne:表示在当前跳跃中能到达的最远位置。
关键步骤:
  1. 初始化 cur = 0ne = 0res = 0,表示跳跃次数。
  2. 遍历数组,更新 ne 为当前能跳到的最远位置。
  3. 每当遍历到 cur 时,说明需要一次新的跳跃(即增加 res),并更新 curne
  4. 如果遍历到最后一个位置,则返回跳跃次数。
代码实现:
class Solution:def jump(self, nums: List[int]) -> int:n = len(nums)cur = 0  # 当前跳跃的最远位置ne = 0  # 当前跳跃能够达到的最远位置res = 0  # 跳跃次数for i in range(n - 1):  # 不需要跳跃到最后一个位置ne = max(ne, i + nums[i])  # 更新最远跳跃位置if i == cur:  # 如果当前位置已经到达了当前跳跃的最远位置res += 1  # 跳跃次数加 1cur = ne  # 更新当前跳跃的最远位置if cur >= n - 1:  # 如果已经能到达最后一个位置,结束breakreturn res
示例:
  • 输入:nums = [2, 3, 1, 1, 4]

  • 输出:2

    解释:可以先从下标 0 跳到下标 1,再从下标 1 跳到下标 4。


做题技巧总结

贪心算法在跳跃问题中的应用

  1. 判断能否到达最后一个位置(跳跃游戏 I)

    • 使用 cur 记录当前最远可达位置,遍历时若当前位置 i 超过 cur,说明无法到达该位置,直接返回 False
    • 每次尽量更新最远可达的位置 cur,确保每一步都能够最大化覆盖区间。
  2. 计算最少跳跃次数(跳跃游戏 II)

    • curne 的配合帮助我们在每次遍历时选出最远的跳跃目标。
    • 每当 i == cur 时,说明必须进行一次跳跃,更新 curne
    • 跳跃的次数 res 每次增加,直到能到达最后一个位置。

贪心算法的优点

  • 时间效率高:这类问题的时间复杂度为 O(n),适合处理大规模数据。
  • 简单直观:通过维护两个变量 curne,不断选择当前能跳得最远的点,快速得到最优解。

注意事项

  • 跳跃过程中要注意“死胡同”:在一些特殊情况下,可能会遇到无法跳跃的情形。例如,在跳跃游戏 II 中,如果遇到 nums[i] == 0 且无法到达后续位置,就需要提前终止。
  • 处理边界条件:确保在输入的边界条件下(如数组长度为 1 或所有元素都为 0)能正确处理。

总结

通过贪心算法,我们能够高效解决跳跃游戏类问题,确保以最少的跳跃次数覆盖目标区间或判断是否能到达终点。掌握这种策略,你就能在面对这类问题时游刃有余,快速找到最优解。

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

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

相关文章

langgraph实现 handsoff between agents 模式 (1)

官网示例代码 from typing_extensions import Literal from langchain_core.messages import ToolMessage from langchain_core.tools import tool from langgraph.graph import MessagesState, StateGraph, START from langgraph.types import Command from langchain_openai…

Redis代金卷(优惠卷)秒杀案例-单应用版

优惠卷表:优惠卷基本信息,优惠金额,使用规则 包含普通优惠卷和特价优惠卷(秒杀卷) 优惠卷的库存表:优惠卷的库存,开始抢购时间,结束抢购时间.只有特价优惠卷(秒杀卷)才需要填写这些信息 优惠卷订单表 卷的表里已经有一条普通优惠卷记录 下面首先新增一条秒杀优惠卷记录 { &quo…

观察者模式和订阅发布模式的关系

有人把观察者模式等同于发布订阅模式,也有人认为这两种模式存在差异,本质上就是调度的方法不同。 发布订阅模式: 观察者模式: 相比较,发布订阅将发布者和观察者之间解耦。(发布订阅有调度中心处理)

Ethflow Round 1 (Codeforces Round 1001, Div. 1 + Div. 2)(A,B,C,E1)

题目链接:Dashboard - Ethflow Round 1 (Codeforces Round 1001, Div. 1 Div. 2) - Codeforces A. String 思路 可以发现最小反转次数就是把每个1单独反转为0就行,即统计1的个数 代码 void solve(){string s;cin>>s;int sum0;for(int i0;i&l…

FreeRTOS从入门到精通 第十五章(事件标志组)

参考教程:【正点原子】手把手教你学FreeRTOS实时系统_哔哩哔哩_bilibili 一、事件标志组简介 1、概述 (1)事件标志位是一个“位”,用来表示事件是否发生。 (2)事件标志组是一组事件标志位的集合&#x…

Leetcode:541

1,题目 2,思路 用List集合来装字符串其中每k个为一个元素单位我们根据题目意思就可以明白list中偶数位需要反转reverse,奇数保持原样再全部拼接一块最后return tostring 3,代码 import java.util.ArrayList; import java.util.…

C语言指针专题四 -- 多级指针

目录 1. 多级指针的核心原理 1. 多级指针的定义 2. 内存结构示意图 3. 多级指针的用途 2. 编程实例 实例1:二级指针操作(修改一级指针的值) 实例2:动态二维数组(二级指针) 实例3:三级指…

Linux运维之Linux的安装和配置

目录 Linux的基本概念: 1.为什么要使用Linux? 2.什么是Linux? Linux的安装和配置: 1.下载Linux的虚拟机和镜像文件: 1.1下载虚拟机 1.2下载镜像文件 2.在虚拟机或者物理机中安装Linux操作系统 3.配置虚拟机的…

第一个3D程序!

运行效果 CPP #include <iostream> #include <fstream> #include <string> #include <cmath>#include <GL/glew.h> #include <GLFW/glfw3.h> #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <glm/gtc/…

deepseek+vscode自动化测试脚本生成

近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…

简要介绍C++中的 max 和 min 函数以及返回值

简要介绍C中的 max 和 min 函数 在C中&#xff0c;std::max 和 std::min 是标准库 <algorithm> 中提供的函数&#xff0c;用于比较两个或多个值并返回最大值或最小值。这些函数非常强大且灵活&#xff0c;支持多种数据类型&#xff08;如整数、浮点数、字符串等&#xff…

【MyDB】4-VersionManager 之 3-死锁及超时检测

【MyDB】4-VersionManager 之 3-死锁及超时检测 死锁及超时检测案例背景LockTable锁请求与等待管理 addvm调用addputIntoList&#xff0c;isInList&#xff0c;removeFromList 死锁检测 hasDeadLock方法资源释放与重分配 参考资料 死锁及超时检测 本章涉及代码&#xff1a;top/…

Elasticsearch:如何搜索含有复合词的语言

作者&#xff1a;来自 Elastic Peter Straer 复合词在文本分析和标记过程中给搜索引擎带来挑战&#xff0c;因为它们会掩盖词语成分之间的有意义的联系。连字分解器标记过滤器等工具可以通过解构复合词来帮助解决这些问题。 德语以其长复合词而闻名&#xff1a;Rindfleischetik…

服务器虚拟化实战:架构、技术与最佳实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 服务器虚拟化是现代 IT 基础设施的重要组成部分&#xff0c;通过虚拟化技术可以提高服务器资源利用率、降低硬件成本&am…

【LLM】Ollama框架入门指北

note Ollama是一个开源框架&#xff0c;专门设计用于在本地运行大型语言模型。它的主要特点是将模型权重、配置和数据捆绑到一个包中&#xff0c;从而优化了设置和配置细节&#xff0c;包括GPU使用情况&#xff0c;简化了在本地运行大型模型的过程。Ollama提供了对模型量化的支…

Linux系统:Ubuntu替换镜像源具体方法;

在Linux系统更新下载软件时&#xff0c;如遇因镜像源问题下载失败时&#xff0c;我们就需要替换系统原有镜像源&#xff0c;那么&#xff0c;此时&#xff0c;你是否还在百度四处搜索可以用的镜像源地址&#xff0c;然后反复去测试源地址的正确性呢&#xff0c;下面介绍一个亲测…

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置&#xff0c;输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字&#xff0c;用于区分8.打开…

HTML(快速入门)

欢迎大家来到我的博客~欢迎大家对我的博客提出指导&#xff0c;有错误的地方会改进的哦~点击这里了解更多内容 目录 一、前言二、HTML基础2.1 什么是HTML?2.2 认识HTML标签2.2.1 HTML标签当中的基本结构2.2.2 标签层次结构 2.3 HTML常见标签2.3.1 标题标签2.3.2 段落标签2.3.3…

d3.js: Relation Graph

d3.js Tags d3/d3 GitHub D3 by Observable | The JavaScript library for bespoke data visualization 下载或 <!-- 引入 D3.js 库 --> <script src"https://d3js.org/d3.v7.min.js"></script> <!-- 引入 D3.js 库 --> <…

Oracle Primavera P6自动进行进度计算

前言 在P6 Professional 有一个自动计划计算的选项&#xff0c;很多人不了解该设置如何使用&#xff0c;以及什么时候该启动这项配置。 详情 P6 Professional 默认为非自动进度计算。启用自动选项后&#xff0c;可以快速查看调度更改的效果。 ​ ​ 如图所示&#xff0c;当你…