学习记录:js算法(七十四):跳跃游戏II

文章目录

    • 跳跃游戏II
      • 思路一:贪心算法
      • 思路二:动态规划
      • 思路三:广度优先搜索 (BFS)
      • 思路四:深度优先搜索 (DFS)

跳跃游戏II

给定一个长度为 n0 索引整数数组 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

思路一:贪心算法

function jump(nums) {let n = nums.length;if (n === 1) return 0; // 如果数组只有一个元素,不需要跳跃let jumps = 0, maxReach = 0, lastJumpPos = 0;for (let i = 0; i < n - 1; i++) {// 找到当前能跳到的最远位置maxReach = Math.max(maxReach, i + nums[i]);// 当前位置已经是上次跳跃能达到的最远位置,需要再进行一次跳跃if (i === lastJumpPos) {jumps++;lastJumpPos = maxReach; // 更新下次跳跃需要开始的位置}}return jumps;
}

讲解
这道题目的解决方案可以通过贪心算法来实现,核心思想是尽可能地让每次跳跃都能让我们到达更远的位置。

  1. 理解问题
    给定一个非负整数数组nums,数组中的每个元素表示你从当前位置可以跳跃的最大长度,目标是到达数组的最后一个位置。要求找到到达最后一个位置所需的最小跳跃次数。
  2. 初始设置
    ● 初始化jumps0,表示跳跃次数。
    ● 初始化maxReach0,用来记录当前能到达的最远位置。
    ● 初始化lastJumpPos0,记录上一次跳跃后能到达的最远位置。
  3. 遍历数组
    遍历数组nums,直到倒数第二个位置(因为到达最后一个位置时自然完成任务,无需额外跳跃)。
  4. 在每次迭代中执行以下步骤:
    1. 更新最大可达位置:计算当前位置i加上其对应的跳跃能力nums[i],取当前最大可达距离与这个值的最大者,更新maxReach。这样可以确保maxReach始终记录着以当前位置为起点能跳到的最远位置。
    2. 判断是否需要跳跃:如果当前遍历到了上一次跳跃所能达到的最远位置(即i === lastJumpPos),说明需要进行下一次跳跃。此时,jumps1,并将lastJumpPos更新为当前的maxReach。这表示从当前位置开始,至少需要一次跳跃来覆盖剩余的距离。
  5. 结果返回
    遍历结束后,jumps即为到达数组最后一个位置所需的最小跳跃次数。

为什么这种方法有效?

  • 这种方法充分利用了贪心策略,每一步都试图做出最优选择,即尽可能通过较少的跳跃覆盖更远的距离。通过维护一个不断向前推进的“最远可达边界”,我们确保了在每次跳跃时都选择了最经济的方案,从而减少了总的跳跃次数。
    通过这种方式,我们避免了暴力搜索或复杂的动态规划状态转移,仅通过一次遍历就高效解决了问题。

思路二:动态规划

var jump = function (nums) {const n = nums.length;if (n <= 1) return 0; // 如果数组长度小于等于1,不需要跳跃const dp = new Array(n).fill(Infinity);dp[0] = 0; // 到达起点不需要跳跃for (let i = 0; i < n; i++) {for (let j = 1; j <= nums[i] && i + j < n; j++) {dp[i + j] = Math.min(dp[i + j], dp[i] + 1);}}return dp[n - 1]; // 返回到达最后一个位置的最小跳跃次数
};

讲解
动态规划的思路是维护一个数组 dp,其中 dp[i] 表示到达索引 i 所需的最小跳跃次数。我们可以通过遍历每个位置来更新后续位置的跳跃次数。
实现步骤:

  1. 初始化 dp[0] = 0,因为到达起点不需要跳跃。
  2. 对于每个位置 i,遍历从 i 可以跳跃到的所有位置 j,并更新 dp[j]。
  3. 返回 dp[n-1],即到达最后一个位置所需的最小跳跃次数。

具体解析:

  1. 输入和目标:
    • 输入是一个非负整数数组,每个元素表示在该位置可以跳跃的最大步数。
    • 目标是计算从数组的起始位置跳到最后一个位置所需的最小跳跃次数。
  2. 处理特殊情况:
    • 首先检查数组的长度。如果长度小于或等于1,说明已经在最后一个位置,因此不需要进行任何跳跃,直接返回0
  3. 初始化动态规划数组:
    • 创建一个与输入数组等长的动态规划数组,用于存储到达每个位置的最小跳跃次数。初始时,所有位置的值都设置为无穷大,表示尚未计算。
    • 起始位置的跳跃次数设置为0,因为从起点到起点不需要跳跃。
  4. 动态规划填充过程:
    • 遍历数组中的每个位置,针对每个位置,查看可以跳跃到的所有后续位置。跳跃的范围由当前元素的值决定,即从当前位置可以跳跃的最大步数。
    • 对于每一个可以到达的位置,更新到达该位置的最小跳跃次数。这个更新是通过比较当前已知的跳跃次数和从当前跳跃位置到达目标位置所需的跳跃次数(即增加一次跳跃)来完成的。
  5. 返回结果:
    • 最后,返回到达数组最后一个位置的最小跳跃次数。

思路三:广度优先搜索 (BFS)

var jump = function (nums) {const n = nums.length;if (n <= 1) return 0; // 如果数组长度小于等于1,不需要跳跃let jumps = 0;let currentEnd = 0;let farthest = 0;const queue = [0]; // 从起点开始while (queue.length) {const size = queue.length; // 当前层的节点数jumps++;for (let i = 0; i < size; i++) {const index = queue.shift(); // 从队列中取出当前节点for (let j = 1; j <= nums[index] && index + j < n; j++) {if (index + j === n - 1) return jumps; // 如果到达最后一个位置,返回跳跃次数queue.push(index + j); // 将可以到达的位置加入队列}}}return jumps; // 返回到达最后一个位置的最小跳跃次数
};

讲解
BFS 可以用于寻找最短路径,因此我们可以将每个位置视为图中的节点,使用队列来进行广度优先搜索。

实现步骤:

  1. 使用队列来存储当前可以到达的位置。
  2. 每次从队列中取出一个位置,检查可以跳跃到的所有位置,并将它们加入队列。
  3. 记录跳跃次数,直到到达最后一个位置。

具体解析:

  1. 输入和目标:
    • 输入是一个非负整数数组,每个元素表示在该位置可以跳跃的最大步数。
      目标是计算从数组的起始位置跳到最后一个位置所需的最小跳跃次数。
  2. 处理特殊情况:
    • 首先检查数组的长度。如果长度小于或等于1,说明已经在最后一个位置,因此不需要进行任何跳跃,直接返回0
  3. 初始化变量:
    • jumps: 用于记录跳跃次数,初始为0
    • currentEnd: 记录当前跳跃能到达的最远位置,初始为0
    • farthest: 记录在当前层中能够到达的最远位置,初始为0
    • queue: 用于存储当前层的节点,从起点(索引0)开始
  4. 广度优先搜索过程:
    • 进入一个循环,直到队列为空。每次循环代表一个跳跃。
    • 在每次跳跃中,增加跳跃次数,并记录当前层的节点数(即可以访问的节点数)。
    • 遍历当前层的所有节点:
      1. 从队列中取出一个节点(当前位置)。
      2. 对于当前位置,计算可以跳跃到的所有后续位置。跳跃的范围由当前节点的值决定。
      3. 如果在跳跃过程中到达最后一个位置(数组的末尾),直接返回当前的跳跃次数。
    • 否则,将所有可以到达的位置加入队列,以便在后续的跳跃中访问。
  5. 返回结果:
    如果队列为空但仍未达到最后一个位置,返回跳跃次数(这在正常情况下不会发生,因为题目保证可以到达最后一个位置)。

思路四:深度优先搜索 (DFS)

var jump = function (nums) {const n = nums.length;if (n <= 1) return 0; // 如果数组长度小于等于1,不需要跳跃let minJumps = Infinity;function dfs(index, jumps) {if (index >= n - 1) {minJumps = Math.min(minJumps, jumps);return;}for (let j = 1; j <= nums[index]; j++) {dfs(index + j, jumps + 1);}}dfs(0, 0); // 从起点开始 DFSreturn minJumps; // 返回到达最后一个位置的最小跳跃次数
};

讲解
DFS 也可以用来解决这个问题,但效率较低,因为它可能会遍历所有可能的路径。

实现步骤:

  1. 从起点开始进行深度优先搜索,尝试跳跃到每个可能的位置。
  2. 记录当前跳跃次数,并在到达最后一个位置时更新最小跳跃次数。

具体解析:

  1. 输入和目标:
    • 输入是一个非负整数数组,每个元素表示在该位置可以跳跃的最大步数。
    • 目标是计算从数组的起始位置跳到最后一个位置所需的最小跳跃次数。
  2. 处理特殊情况:
    • 首先检查数组的长度。如果长度小于或等于1,说明已经在最后一个位置,因此不需要进行任何跳跃,直接返回0
  3. 初始化变量:
    • minJumps: 用于记录达到最后一个位置所需的最小跳跃次数,初始设置为无穷大(Infinity),表示尚未找到有效的跳跃路径。
  4. 深度优先搜索过程:
    • 定义一个递归函数 dfs(index, jumps),其中 index 表示当前的位置,jumps 表示到达该位置所需的跳跃次数。
    • 在每次递归调用中,首先检查当前索引是否已经到达或超过最后一个位置。如果是,则更新 minJumps 为当前跳跃次数 jumps 和已有的 minJumps 的最小值。
    • 如果当前索引未到达最后位置,遍历从当前位置可以跳跃到的所有后续位置(由 nums[index] 决定的跳跃范围)。
    • 对于每一个可以跳跃到的位置,递归调用 dfs,将当前索引增加跳跃步数并将跳跃次数加1
  5. 开始搜索:
    • 调用 dfs(0, 0) 从起点开始进行深度优先搜索,初始跳跃次数为0
  6. 返回结果:
    • 最后返回 minJumps,即到达最后一个位置所需的最小跳跃次数。

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

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

相关文章

【电机应用】变频器控制——变频水泵、变频空调

【电机应用】变频器控制——变频水泵、变频空调 文章目录 [TOC](文章目录) 前言一、变频器1、变频器的组成2、变频器的工作原理3、变频器常用算法 二、变频器的应用场景1、变频水泵2、变频空调 三、参考文献总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文…

Android 原生开发与Harmony原生开发浅析

Android系统 基于Linux ,架构如下 底层 (Linux )> Native ( C层) > FrameWork层 (SystemService) > 系统应用 (闹钟/日历等) 从Android发版1.0开始到现在15,经历了大大小小的变革 从Android6.0以下是个分水岭,6.0之前权限都是直接卸载Manifest中配置 6.0开始 则分普…

Matlab|基于氢储能的热电联供型微电网优化调度方法

目录 1 主要内容 模型求解流程 2 部分程序 3 程序结果 日前调度 日内调度 4 下载链接 1 主要内容 该程序复现《基于氢储能的热电联供型微电网优化调度方法》&#xff0c;针对质子交换膜燃料电池和电解槽的热电联供特性&#xff0c;为避免氢能系统的热能浪费并进一步提高…

k8s 综合项目笔记

综述 这篇笔记主要是为了记录下自己写 k8s 综合项目的过程。 由于自己之前已经写过简单的开发和运维项目&#xff0c;所以这里就结合一下&#xff0c;在搭建 k8s 集群后安装运维常用服务&#xff0c;比如 ansible 和 prometheus&#xff0c;用 NFS 实现数据存储同步&#xff0c…

Windwos下Docker下载安装centos7.6

操作步骤&#xff1a; 1.打开docker软件进入到DockerHub页面搜索contos镜像 2.在终端通过命令获取镜像并创建容器运行 docker run -itd --name test_centos7.6 centos:7.6.1810 test_centos7.6表示容器的名称 centos:7.6.1810表示镜像的名称&#xff0c;如果镜像不存在会默认拉…

网络层知识点总结4

目录 前言 一、什么是NAT&#xff1f;什么是NAPT&#xff1f;NAT的优点和缺点有哪些&#xff1f;NAPT有哪些特点&#xff1f; 二、建议IPv6协议没有首部检验和。这样做的优缺点是什么&#xff1f; 三、当使用IPv6时&#xff0c;协议ARP是否需要改变&#xff1f;如果需要改变…

ArcGIS计算多个面要素范围内栅格数据各数值的面积

本文介绍在ArcMap软件中&#xff0c;基于面积制表工具&#xff08;也就是Tabulate Area工具&#xff09;&#xff0c;基于1个面要素数据集与1个栅格数据&#xff0c;计算每一个面要素中各栅格数据分布面积的方法。 首先&#xff0c;来看一下本文的需求。现有一个矢量面的要素集…

Springboot整合原生ES依赖

前言 Springboot整合依赖大概有三种方式&#xff1a; es原生依赖&#xff1a;elasticsearch-rest-high-level-clientSpring Data ElasticsearchEasy-es 三者的区别 1. Elasticsearch Rest High Level Client 简介: 这是官方提供的 Elasticsearch 客户端&#xff0c;支持…

小问题解决方法汇总(2024.10.24水个勋章)

问题1&#xff1a;”因为在系统上禁止运行脚本“ 我们在使用命令行时经常遇到类似文章这样的提示&#xff0c;或者是如下截图中显示的那样&#xff1a; 仅需要在“管理员权限下的Powershell”中输入下面的命令即可解决&#xff1a; set-ExecutionPolicy RemoteSigned 输入命…

【数据分享】全国科技-产品质量国家监督抽查(1995-2021年)

数据介绍 一级标题指标名称单位科技国家监督抽查产品种类种科技国家监督抽查食品种类种科技国家监督抽查日用消费品种类种科技国家监督抽查建筑与装饰装修材料种类种科技国家监督抽查农业生产资料种类种科技国家监督抽查工业生产资料种类种科技国家监督抽查企业家科技国家监督抽…

软工毕设开题建议

文章目录 &#x1f6a9; 1 前言1.1 选题注意事项1.1.1 难度怎么把控&#xff1f;1.1.2 题目名称怎么取&#xff1f; 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢&#xff1f; &#x1f6a9;2 选题概览&#x1f6a9; 3 项目概览题目1 : 深度学习社…

一文讲明白大模型分布式逻辑(从GPU通信原语到Megatron、Deepspeed)

1. 背景介绍 如果你拿到了两台8卡A100的机器&#xff08;做梦&#xff09;&#xff0c;你的导师让你学习部署并且训练不同尺寸的大模型&#xff0c;并且写一个说明文档。你意识到&#xff0c;你最需要学习的就是关于分布式训练的知识&#xff0c;因为你可是第一次接触这么多卡…

【数据仓库】数据仓库面试题

简单整理了一下题目和答案&#xff0c;希望对大家有所帮助。 第一面&#xff1a;基础技术与概念 什么是ETL&#xff1f;请解释ETL过程中的每个步骤。 ETL是Extract, Transform, Load的缩写&#xff0c;用于描述将数据从源系统提取、转换为适合分析的形式、最后加载到目标系统的…

使用vscode拉取release远程分支,发现没有这个分支,但是远程仓库里确确实实有,是因为没有及时更新远程仓库分支导致

今天在开发过程中&#xff0c;需要从release分支上拉取代码重新拉个分支开发&#xff0c;方便后面迭代更新。但是我在vscode里点击分支&#xff0c;发现没有远程分支release/v1.0.0&#xff0c;但是仓库里确确实实有这个分支。然后我就上网查有类似的情况&#xff0c;参考别人是…

74页PPT智能工厂整体规划方案

▲关注智慧方案文库&#xff0c;学习9000多份最新解决方案&#xff0c;其中 PPT、WORD超过7000多份 &#xff0c;覆盖智慧城市多数领域的深度知识社区&#xff0c;稳定更新4年&#xff0c;日积月累&#xff0c;更懂行业需求。 智能工厂的定义 根据《智能工厂通用技术要求》的…

【个人记录】新电脑的配置截图和电源选项的修改

核心硬件评测&#xff1a; 硬件参数&#xff1a; #修改的电源设置# 电源选项-编辑计划设置-修改的设置&#xff1a; 电源选项-关闭盖子时-修改的设置&#xff1a;

MapStruct浅尝

<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…

一文掌握异步web框架FastAPI(七)-- 安全(XSS 和 CSRF 防护、权限和角色控制、审计日志、使用安全的随机数生成、API 文档保护、会话管理)

接上篇:一文掌握异步web框架FastAPI(六)-- 安全(HTTP验证、Bearer Token、Session、OAuth2 和 OpenID Connect、HTTPS 和 TLS、速率限制)-CSDN博客 目录 九、安全 7、XSS 和 CSRF 防护 1)XSS防护 2)CSRF防护 8、安全的数据存储 9、环境变量管理 10、权限和角色控…

Redis 命令集 (超级详细)

目录 Redis 常用命令集 string类型 hash类型 list类型 set类型 zset类型 bitmap 类型 geo 类型 GEOADD (添加地理位置的坐标) GEOPOS (获取地理位置的坐标) GEODIST (计算两个位置之间的距离) GEOHASH (返回一个或多个位置对象的 geohash 值) GEORADIUS (根据用户…

LeetCode_2413. 最小偶倍数_java

1、问题 2413. 最小偶倍数https://leetcode.cn/problems/smallest-even-multiple/给你一个正整数 n &#xff0c;返回 2 和 n 的最小公倍数&#xff08;正整数&#xff09;。 示例 1&#xff1a; 输入&#xff1a;n 5 输出&#xff1a;10 解释&#xff1a;5 和 2 的最小公倍…