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

LeetCode--45.跳跃游戏 II

前言:今天可是没有断更哦

解题思路:

        1.获取信息:

                给定一个长度为 n 的并且以0索引开头的整数数组,初始位置为nums[0]

                每个元素nums[ i ]表示,从索引 i 向后可跳转的最大长度

                意思就是说,你拼尽全力可以跳那么远,但是你也可以不用全力,也可以不跳

                所以你跳跃的范围在 0 到 nums[ i ]之间,闭区间

                要求返回到达 nums[ n-1 ]的最小跳跃次数

                提示信息:题目保证可以到达nums[ n-1 ]

                                  nums[ i ]的值可能会为0

        2.分析题目:

                这道题还蛮有意思的,蹦蹦跳跳的问题

                我在碰到类似这样的蹦蹦跳跳的游戏的时候,我一般会在脑子里面模拟我跳跃的每一种情况

                也就是把所有情况都走一遍就可以知道最小的跳跃次数了,这就是暴力法的雏形

                我在后面对暴力法进行了优化,因为暴力法会在第74个示例的时候超时

                另外根据提示信息和力扣的题解,我也了解了一种方法

                每种方法的思路放在了尝试编写代码的环节,借着代码来帮助你理解

        3.示例查验:

                示例2:提醒了,nums[ i ]的值可能会为0

        4.示例查验:

                (1)暴力法:(会在第74个示例的时候超时)

                        思路我已经在分析题目环节时说过了,就不做过多阐述了

class Solution {
public:int jump(vector<int>& nums) {return GetRes(nums,0,nums.size(),0);}
private:int GetRes(vector<int>&nums,int i,int size,int index){if(i>=size-1)return index;if(nums[i]==0)return INT_MAX;int res=INT_MAX;for(int j=1;j<=nums[i];j++){res=min(res,GetRes(nums,i+j,size,index+1));}return res;}
};

                (2)提前看一步(暴力法的优化):

                        优化思路:暴力法之所以会超时,就是因为把那些一看就不可能是最小跳跃数的情况也彻底执行了

                        所以,我在对选取跳跃距离的步骤上加了一个判断条件,我原本在的位置为 k ,如果我跳过去的那个位置为 i ,nums[ i ]的最大长度为 j ,确保 j + ( i - k )是最长的,那么这种情况就是一个优先的选择

                        说实话,我觉得这个优化能过全是这道题目其实并不严苛,因为我这相当于只是提前模拟了一步,就像围棋中我在脑子里面在我原有的一步中模拟了下一步可能的结果

                        模拟的下一步可能只是对于当前信息来说是有利的,但是长远来看,可能就误入歧途了

                        所以这个方法有运气成分

class Solution {
public:int jump(vector<int>& nums) {return GetRes(nums,0,nums.size(),0);}
private:int GetRes(vector<int>&nums,int i,int size,int index){if(i>=size-1)return index;int dis=0;int op=0;for(int j=1;j<=nums[i];j++){if(i+j>=size-1)return index+1;if(nums[i+j]+j>dis){op=j;dis=nums[i+j]+j;}}return GetRes(nums,i+op,size,index+1);}
};

                (3)贪心算法:

                        思路:提示信息表明,题目保证可以到达nums[ n-1 ],那么我们可以从结尾开始找开头,也就是逆向查找

                        我们知道,倒数第一步肯定是一步就到了nums[ n-1 ],我们就找出可以一步到达nums[ n-1 ]的位置,这个位置应该尽可能在左边,接近开头的位置

                        找到了这个位置,就依次类推,查找倒数第二步的位置

                        这个方法为什么可行呢?        

                        正常的跳法是有规章的,不一定每一步都跳最长的距离,它需要计算到达nums[ n-1 ]的距离,我们这么贪心的查找,最后达到的位置应该是一般大于开头到末尾的距离的

                        这样的话,它跳跃的步数,就是一个简练的步数,因为每次都跳了最长的距离

                        不过,我觉得也有一部分原因是这道题并不严苛,主要是考察奇思妙想的

class Solution {
public:int jump(vector<int>& nums) {int web=nums.size()-1;int index=0;while(web>0){for(int i=0;i<web;i++){if(nums[i]+i>=web){web=i;index++;break;}}}return index;}
};

本次题解就到此为止了,你在碰到题目的时候,要想一下它在考察什么,不要小瞧了每一道题目,也不要高估了每一道难题,世界上没有完美的一道题目,有的只是想让你懂得什么的题目,所以不要盲目自大,看见这道题目出得不好,就贬低,甚至不屑于去看一眼,这样是错误的,也是最幼稚的一种态度,要常怀谦卑和包容,包容别人,也要包容自己

今天竟然在没到吃晚饭的时间就做好了,感觉自己的懒惰已经被消磨了,大大的进步,哈哈

在最后,纸上得来终觉浅,绝知此事要躬行

http://www.lryc.cn/news/587548.html

相关文章:

  • MMKV 存储json list数据(kotlin)
  • 各种开发语言主要语法对比
  • 嵌入式硬件篇---单稳态多谐施密特电路
  • 第八章排序 选择题
  • Linux 基础操作:vim 编辑器、网络配置与远程登录全解析
  • 算法-线性枚举
  • 【算法】贪心算法:摆动序列C++
  • 解决Qt中“known incorrect sRGB profile“警告的Photoshop修改方法
  • 【记录】BLE|百度的旧蓝牙随身音箱手机能配对不能连接、电脑能连接不能使用的解决思路(Wireshark捕获并分析手机蓝牙报文)
  • 一文读懂循环神经网络(RNN)—语言模型+n元语法(1)
  • Knife4j快速入门
  • 基于微信小程序的财务管理系统的设计与实现;账本管理系统的设计与实现
  • 云手机常见问题解析:解决延迟、掉线等困扰
  • Lovable - AI 驱动的全栈应用开发平台
  • 4G模块 A7670发送英文短信到手机
  • django parler 使用教程
  • Foundry 私钥管理指南:方法与安全最佳实践
  • es的自定义词典和停用词
  • aspnetcore Mvc配置选项中的ModelMetadataDetailsProviders
  • 幻想读 通过多版本并发控制(MVCC)和间隙锁(Gap Lock)的组合也能防止幻读具体说下
  • 基于R语言的极值统计学及其在相关领域中的实践技术应用
  • Linux RDMA Maillist patchsets (Jul. 7 - Jul. 13, 2025)
  • 【LeetCode240.搜索二维矩阵Ⅱ】以及变式
  • 传统机器学习在信用卡交易预测中的卓越表现:从R²=-0.0075到1.0000的华丽转身
  • 【Hadoop科普篇】大数据怎么处理?Hadoop是什么?跟HDFS, Spark, Flink, Hive, Hbase是什么关系?
  • React Three Fiber 实现 3D 模型视图切换、显隐边框、显隐坐标轴
  • JavaScript 性能优化实战:深入性能瓶颈,精炼优化技巧与最佳实践
  • 如何彻底解决PLM/ERP/MES等系统访问速度慢问题?
  • ThinkPHP 8 在 Apache 下启用伪静态
  • .NET 9 GUID v7 vs v4:时间有序性如何颠覆数据库索引性能