< 每日算法 - JavaScript解析:跳跃游戏 Ⅰ/ Ⅱ - 贪心 >

news2024/11/23 12:11:23

在这里插入图片描述

每日算法 - JavaScript解析:跳跃游戏 Ⅰ/ Ⅱ - 贪心

  • 跳跃游戏 Ⅰ
    • ① 任务描述:
      • > 示例一
      • > 示例二
    • ② 题意解析
    • ③ 解决方案:
  • 跳跃游戏 Ⅱ
    • ① 任务描述:
      • > 示例一
      • > 示例二
    • ② 题意解析
    • ③ 解决方案
  • 往期内容 💨

跳跃游戏 Ⅰ

① 任务描述:

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

本题取自 leetcode 面试150题 题集

> 示例一

输入:nums = [2,3,1,1,4]
输出:true
解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 13 步到达最后一个下标。

解释:根据题目可知,每个节点最多可跳 nums[i] 步, 那么在i点时,最大可达位置为 i + nums[i], 可以通过贪心算法,比较 maxStep 当前最大可达位置和当前最大可达步数大小: maxStep = Math.max(maxStep, i + nums[i]),具体效果可以参考下图:

效果图

如上图所示,第 2 个 位置的最大可达位置已经大于等于 目的地的位置下标了,故可达目的地!

> 示例二

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样,总会到达下标为 3 的位置。但该下标的最大跳跃长度是 0 , 所以永远不可能到达最后一个下标。

解释:如下图所示:无论哪个节点,可达的最大位置均小于 目的地的下标,故不能到达目的地!

在这里插入图片描述

② 题意解析

根据题目,可知: 题目需要计算出一组数据中,能否到达目标位置,故我们需要求数据中,在能抵达的情况下,求得最大可达位置,并且与目标位置下标进行比较。若 最大可达位置 > 目标下标,则可达目的地,返回 true,反之返回 false

解题思路
通过循环一步一步去获取每一步的最大可跳跃到达的位置,与上一步最大可达位置比较大小,取最大值!需要规定前提是,上一步的最大可达位置 大于 当前位置下标,否则为到达不了!

③ 解决方案:

/**
 * @param {number[]} nums
 * @return {boolean}
 */
var canJump = function(nums) {
	// 写法一: 仅为了展示每个点可达的最大距离
    let numsInfo = nums.reduce((pre, cur, curIndex) => {
        // 这个是为了展示每个节点最远可达距离,取每个点最远可达距离,一个一个向前递进
        pre.itemLenList.push([curIndex, curIndex + cur])

        if(curIndex !== nums.length - 1 && pre.maxStep >= curIndex) {
            // 获取全局最远可达距离,其实可以用循环代替,当最远可达距离超出或抵达目标点,就可以退出了,用这种主要为了理解
            pre.maxStep = Math.max(pre.maxStep, curIndex + cur)
        }
        return pre
    }, { itemLenList: [], maxStep: 0 })

    return numsInfo.maxStep >= nums.length - 1
	
	// 语义化写法二:
	// 默认第一步自执行,即初始赋值为nums[0]
    let len = nums.length, maxStep = nums[0]
    for(let i = 1; i < len - 1; i++) {
    	// 判断提前到达,结束循环
        if(maxStep >= len - 1) break
        
        // 判断上一个最大可达位置是否能到达当前下标,能则继续,反之结束循环
        if(maxStep >= i) {
            maxStep = Math.max(maxStep, i + nums[i])
        }  else break
    }

    return maxStep >= len - 1
};

跳跃游戏 Ⅱ

① 任务描述:

给定一个长度为 n 的 0 索引整数数组 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.length <= 104
  • 0 <= nums[i] <= 1000
  • 题目保证可以到达 nums[n-1]

> 示例一

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

> 示例二

输入: nums = [2,3,0,1,4]
输出: 2

② 题意解析

根据题目可知,这组 nums数据,是必定能够到达 nums[n - 1]。 只需要求到达目的的最优解,最少步数。说到步数,自然要与贪心算法联系起来,这题也不例外!我们需要在尽量减少步数的情况下,走最大可达位置。

这就需要我们记录当前节点对应的最大可达位置,这与上一题相似,通过 Math.max() 循环取最值。 在循环到上一个节点最大可达位置时,将走到这个位置途径的节点中最大值进行赋值。相当于更新最大可达到位置,使循环继续前进!直到当最大可达位置到达目的地!

每当最大可达位置没到目标位置,但又到达了当前循环节点下标 i 时,记录为一次跳跃,即: 向前跳跃一步!计入步数中。

效果图

如上图所示,当 下标 0 的可达最大位置,与 i 循环到 2时(lastMaxIndex === i), 已经无法继续前进时,需要选择一个 lastMaxIndex 步数内能到达最远的一个位置去跳跃, 也就是下图中的 下标 1 的位置,为上一个节点 lastMaxIndex 内,最远可达的节点,故将它更新赋值给 lastMaxIndex 。 此时判断是否满足条件,不满足则继续循环执行,反之则退出循环,输出结果!

③ 解决方案

/**
 * @param {number[]} nums
 * @return {number}
 */
var jump = function(nums) {
    let len = nums.length
    let lastMaxIndex = 0
    let maxReachIndex = 0
    let steps = 0

    for(let i = 0; i < len - 1; i++) {
        // 获取 lastMaxIndex 途径的最大可达距离
        maxReachIndex = Math.max(maxReachIndex, nums[i] + i)

        // 当lastMaxIndex已经到达目的地,跳出循环
        if(lastMaxIndex >= len - 1) break

        /* 当 i 已经循环到 上一个节点的位置,但却没有退出循环时,此
        时需要寻找下一个可以跳到最远的距离的节点。 即: 将 maxReachIndex 
        途径点取的最大可达距离赋值给 lastMaxIndex,故 maxReachIndex 最大值所
        在的下标为下一个跳跃的节点(不需要记录)。
        */
        if(lastMaxIndex === i) {
            lastMaxIndex = maxReachIndex
            steps++
        }
    }
    return steps
};

成绩图

自此解决两个简单的贪心算法相关题目,成绩还算不错,就是因为定义变量过多的缘故,内存占用偏大!

不过算法题还是希望小伙伴们,亲自去动动手,敲敲代码!动动脑,思考一下! 才能更好的去消化! 最后,希望大伙能给个三连支持一下呀!


往期内容 💨

🔥 < 每日算法 - JavaScript解析:一文解决 “ 买卖股票 ” 系列算法题 >

🔥 < vue + ElementUi 组件封装:实现弹窗展示富文本数据,允许全文搜索高亮显示搜索内容 >

🔥 < 每日算法:一文带你认识 “ 双指针算法 ” >

🔥 < 每日知识点:关于Javascript 精进小妙招 ( Js技巧 ) >

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

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

相关文章

09_SPI-Flash 页写实验

09_SPI-Flash 页写实验 1. 实验目标2. 操作时序3. 模块框图3.1 顶层模块3.2 页写模块 4. 波形图5. RTL5.1 flash_pp_ctrl5.2 spi_flash_pp 6. Testbench6.1 tb_flash_pp_ctrl6.2 tb_spi_flash_pp 1. 实验目标 使用页写指令&#xff0c;向 Flash 中写入 N 字节数据&#xff0c;…

4.postgresql--rollup,grouping sets,cube

PostgreSQL ROLLUP 是group by 的子句&#xff0c;是生成多个分组集合的快捷功能。与Cube子句的差异是&#xff0c;rollup 不生成基于特定列所有可能的分组集合&#xff0c;生成分组集合为其子集。 ROLLUP假设输入列之间存在层次结构&#xff0c;从而生成有意义的所有分组集合…

PyQt5+Python制作的位图字体生成工具

前言 本篇在讲什么 Pyqt5制作的Fnt字体创建工具 本篇需要什么 对Python语法有简单认知 依赖Python3.7环境 依赖Pycharm编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&#xff0c;快速上手 提供全流程的源码内容 ★提高阅读体验★ &#x1f449…

HW5300V3-ISCSI存储运维,看这一篇就够了03——HOST

HOST-创建主机01 1、选择“资源分配”→“主机” 2、选择“主机”→"创建"→"手动创建" 3、设置host属性&#xff0c;下一步 4、配置启动器。如已创建了启动器&#xff0c;选择对应的&#xff0c;下一步。如未创建可直接”下一步“后面创建再关联&#xff…

语义分割混淆矩阵、 mIoU、mPA计算

一、操作 需要会调试代码的人自己改&#xff0c;小白直接运行会出错 这是我从自己的大文件里摘取的一部分代码&#xff0c;可以运行&#xff0c;只是要改的文件地址path比较多&#xff0c;遇到双引号“”的地址注意一下&#xff0c;不然地址不对容易出错 把 calculate.py和 u…

prometheus调整默认数据存储时间

调整kubernetes部署的prometheus数据存储时间 由于prometheus是用kuberentes部署的&#xff0c;没办法像传统部署方式那种直接在启动参数增加存储时间的参数。需要在configmap里或者在deployment里添加&#xff0c;我这里使用的方式是在deployement里添加调整存储时间的参数。…

数据库基本操作--------MySQL事务

目录 一、MySQL事务的概念 二、事务的ACID特点 1、原子性 2、一致性 3、隔离性 4、持久性 三、事务之间的相互影响 四、MySQL及事务隔离级别 1、查询全局事务隔离级别 2、查询会话事务隔离级别 3、设置全局事务隔离级别 4、设置会话事务隔离级别 五、事务控制语句 1、测…

ant 后台自定义左侧菜单的图标

最终达成结果&#xff1a; 操作步骤 1.登录阿里图库新增项目 iconfont-阿里巴巴矢量图标库 &#xff0c;点击资源管理-我的项目-新增项目&#xff0c;如图所示&#xff1a; 填写项目名称&#xff0c;项目名称随便填&#xff0c;不重要 填写前缀和font family&#xff0c;如上…

Linux的未来前景:多领域发展势头强劲

Linux在未来的发展前景非常广阔&#xff0c;可以涵盖多个领域和职业方向。刚好&#xff0c;我这里有嵌入式学习路线&#xff0c;毕设&#xff0c;各种项目&#xff0c;需要留个6。以下是一些可能的Linux发展方向&#xff1a;服务器方向&#xff1a;Linux在服务器领域应用广泛&a…

性能测试之性能问题分析

目录 开始性能测试前需要了解的内容&#xff1a; 测试策略&#xff1a; 压测中遇到的性能问题及解决办法&#xff1a; 性能问题分析流程 开始性能测试前需要了解的内容&#xff1a; 1、项目具体需求。 2、指标&#xff1a;响应时间在多少以内&#xff0c;并发数多少&#xff…

从技术出发or从场景出发:大模型开始“路线分化”?

文 | 智能相对论 作者 | 叶远风 大模型时代&#xff0c;厂商们狂奔突袭&#xff0c;技术创新一浪高过一浪。 在这个过程中&#xff0c;先赶上风口做出一个大模型产品&#xff0c;宣传一波、站稳脚跟&#xff0c;再慢慢谈场景应用、价值落地&#xff0c;是很多厂商的做法——…

第二届计算与人工智能国际会议 | ACM-ICPS独立出版 | 快速检索

会议简介 Brief Introduction 第二届计算与人工智能国际会议(ISCAI 2023) 会议时间&#xff1a;2023年10月13 -15日 召开地点&#xff1a;中国上海 大会官网&#xff1a;www.iscai.org 2023年第二届计算与人工智能国际会议(ISCAI 2023)将围绕“计算与人工智能”的最新研究领域而…

【学会动态规划】使用最小花费爬楼梯(3)

目录 动态规划怎么学&#xff1f; 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后&#xff1a; 动态规划怎么学&#xff1f; 学习一个算法没有捷径&#xff0c;更何况是学习动态规划&#xff0c; 跟我…

webpack项目和vue项目发布,浏览器存在缓存

项目是webpack搭建的每次发步到线上&#xff0c;经常需要手动清楚浏览器缓存才能有效果。vue项目设置在最下面 项目打包的js&#xff08;css也是一致&#xff09;名称都采用哈希值 问题&#xff1a;哈希值在有些情况下打包会不变&#xff0c;导致浏览器使用自己缓存的资源 解…

洗地机选哪个牌子好、洗地机排名

洗地机可以说是现代家居清洁首选设备。因为它比拖把拖地更加高效率&#xff0c;同时对比扫地机和吸尘器拥有更多的清洁功能&#xff0c;干湿垃圾一起拖少。并且自清洁功能能够帮助它更好的清理干净滚刷和管道&#xff0c;清洁使用非常省心省力。下面小编就给大家分享几款家庭清…

红队打靶:Brainpan打靶思路详解(vulnhub)

目录 写在开头 第一步&#xff1a;主机发现和端口扫描 第二步&#xff1a;web渗透 第三步&#xff1a;缓冲区溢出漏洞识别 第四步&#xff1a;定位eip寄存器&#xff08;确定溢出字符串的长度&#xff09; 第五步&#xff1a;ESP扩容&#xff08;判断ESP寄存器的大小是否…

如何在 3ds Max 中使用 Mental Ray 制作逼真的草地和带有光晕的天空

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 首先&#xff0c;您将创建一个平面对象&#xff0c;然后添加一个噪点修改器。在此之上应用毛发和毛皮修饰符。 这将用于模拟逼真的草地。 我们用日光系统创造太阳和天空。为太阳添加镜头和戒指效果以及酷炫…

防火墙规则过期通知

作为规则管理最佳实践&#xff0c;大多数安全管理员为其防火墙规则设置到期日期。过期后&#xff0c;需要更正防火墙规则才能再次激活。但是&#xff0c;由于大多数组织都有数百个规则和多个安全管理员处理这些规则&#xff0c;因此几乎不可能查看过期的规则并手动纠正它们。这…

GPT的体验与思考

文章目录 一、GPT使用过程之对话二、AI大模型训练之文生图三、总结与思考 本文用到的词汇偏口语&#xff0c;甚至是小编自己创造&#xff1b;本文主要关注点在于使用和使用后的思考。 一、GPT使用过程之对话 在chart-gpt刚刚爆火出圈的时候&#xff0c;我并没有选择立马使用、…

力扣 309. 最佳买卖股票时机含冷冻期

一、题目描述 给定一个整数数组 prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;&#xff1a; 卖出股票后&#xff0c…