当前位置: 首页 > news >正文

力扣网编程45题:跳跃游戏II之正向查找方法(中等)

一. 简介

前面一篇文章使用贪心算法逆向思维解决了力扣网45题:跳跃游戏II,文章如下:

力扣网编程45题:跳跃游戏II之逆向思维(中等)-CSDN博客

因为之前采用逆向推导的方法时间复杂度为O(n*n),是比较高的,本文采用正面查找方法来解决方法,来降低时间复杂度。

二. 力扣网编程45题:跳跃游戏II之正向查找方法

给定一个长度为 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 = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
     从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。

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

解题思路二:(正向查找可到达的最远距离)

这个题的目标是用最少得跳跃次数到达数组的最后一个位置。

这里也是使用贪心算法,正向查找跳跃次数最少的路径。

算法核心思想:

使用贪心算法的思想,通过维护两个变量来追踪跳跃过程中的位置和步数(最少跳跃次数的路径中):

当前跳跃的最远距离(current_end):表示当前跳跃能到达的最远位置;

下一步跳跃的最远位置(farthest):表示在当前跳跃的基础上,下一步能够到达的最远位置;

举例说明:

具体实现思路:

1. 贪心算法:通过每一次选择能跳到的最远位置来最小化跳跃次数;

2. 维护边界:维护当前能跳跃到达的最远位置(current_end)和下一步跳跃能到达的最远位置(farthest);

3.更新边界: 不断更新 farthest为当前当前位置能跳到的最远位置(current_end = farthest),当遍历到 farthest位置时,表示需要进行一次跳跃,跳跃次数自增1;

4.提前终止:如果current_end已经大于等于 numsSize-1这个位置,可以提前退出循环;

C语言实现如下:


//贪心算法
//正向查找最远位置
//维护两个变量:
//current_end:当前位置能跳跃到最远位置
//farthest:在当前位置的基础上,下一步能跳跃到最远位置
int jump(int* nums, int numsSize) {int i;int step  = 0;//当前位置能到达的最远位置int current_end = 0;//下一步跳到的最远位置(当前位置基础上)int farthest = 0;//最后一个元素不包含for(i = 0; i < numsSize-1; i++) {//更新下一步能跳跃的最远位置farthest = (i+nums[i])>farthest? (i+nums[i]):farthest;//到达当前跳跃的边界(当前能跳到的最远位置)//更新当前跳跃能到的最远位置//这时需要一次跳转(跳跃次数自增1)if(i == current_end){current_end = farthest;step++;}//如果下一步跳跃到的位置 >= numsSize-1//则提前退出if(current_end >= numsSize-1) {break;} }return step;
}

可以看出,正向查找方法只遍历了一次数组,算法的时间复杂度为O(n)。

http://www.dtcms.com/a/267891.html

相关文章:

  • 【深度学习新浪潮】AI在材料力学领域的研究进展一览
  • 基于51单片机智能婴儿床
  • SQL 一键生成 Go Struct!支持字段注释、类型映射、结构体命名规范
  • 从前端转go开发的学习路线
  • 3、Configuring Topics
  • I-Cache、D-Cache 和 SRAM 的区别与联系
  • 系统架构设计师论文分享-论软件体系结构的演化
  • Docker容器中安装MongoDB,导入数据
  • nvm常用指令汇总
  • Spark流水线数据质量检查组件
  • 【认知】如何在高强度工作中保持心理健康和情绪稳定?
  • WizTree v4.2.5 x86 x64 单文件版
  • 让你的asp.net网站在调试模式下也能在局域网通过ip访问
  • Java 双亲委派机制笔记
  • GitCode项目创建指南
  • 一文掌握Qt Quick数字图像处理项目开发(基于Qt 6.9 C++和QML,代码开源)
  • 【黑马点评】(二)缓存
  • PyTorch 2.7深度技术解析:新一代深度学习框架的革命性演进
  • Python作业1
  • 实现Spring MVC登录验证与拦截器保护:从原理到实战
  • Jiraph​ 简介
  • React 各颜色转换方法、颜色值换算工具HEX、RGB/RGBA、HSL/HSLA、HSV、CMYK
  • AcWing--873.欧拉函数
  • ARMv8 创建1、2、3级页表代码与注释
  • 【C++基础】内存管理四重奏:malloc/free vs new/delete - 面试高频考点与真题解析
  • Windows 11 Enterprise LTSC 转 IoT
  • C++ i386/AMD64平台汇编指令对齐长度获取实现
  • LangChain:构建一个Agent(入门篇四)
  • [leetcode] C++ 并查集模板
  • 【机器学习笔记 Ⅱ】1 神经网络