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

贪心算法学习 跳跃游戏

给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。

判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。

我思考的是 是不是只要不跳到位置0 那么就不会导致没办法到最后一步?我先假设在这个数组中只有一个0 那么如果这个0前面的序列是按照差值为1进行递增的 那么就不行 

class Solution(object):def canJump(self, nums):min=float('inf')for i in range(len(nums)):if nums[i]<min:min=nums[i]if min!=0:return True#只要没有0 那么一定是可以到达的#如果有0的话 只要可以不经过这个0 那么就可以达到最后#那么跳不过的是有啥情况呢?只要0前面不是递增的就行#现在假设在这个数组中只会有一个0 我们来写代码index_0=-1for i in range(len(nums)-1,0,-1):if nums[i]==0:index_0=ibreak#得到是0的那个索引while index_0>=0:if nums[index_0-1]==nums[index_0]+1:index_0-=1else:return Truereturn False
solution=Solution()
result=solution.canJump([3,2,1,0,4])
print(result)

但是实际情况是 这个数组中可能有多个0  对于第一个0来说 它之前的元素不能是连续的等差数列 然后过了这个0之后继续往下走 不管是跳到哪一步 0前面的都不能是等差数列 只要两个0之间的 这些元素 不和第二个0构成一个等差数列 那就没事 一旦有等差数列肯定就必须要经过0了 好的我们来补全代码

然后我突然发现还是不对啊 因为比如 2 3 4 3 2 1 0 这样的 即使0前面的并不是等差数列 那不还是一定会经过0吗?所以我找的规律不对 救命我不会找了 这个到底是啥规律啊 我继续找 3 2 1 0到不了是不是最大的3 最远只能到0 如果是 7 3 2 1是不是就没问题

再看 是不是只要0前面存在的这个元素 它的大小能超过和0的距离是不是就可以 我们来看一些情况是不是这样的:2 3 4 6   0 4 5 2 3 0 3 2 2 2  0  7 5 5 4 4 2 2 1 0 第一个0 6超过了 第二个 3可以 第三个 2也可以 最后一个虽然是到0但是0是最后一个 也没关系 

那我们就有想法了 

  • 一旦发现 0(意味着当前点不能再往前跳),

  • 就从它前面的数字里找有没有人“跳得够远”,能跨过这个 0

  • 如果找不到这样的“救兵”,就卡住了。

发现是0 看前面有没有满足的 你可以一直往前面找 直到找到一个满足的没事  如果有 那没事 肯定是有救兵的 直接Break 并且i+=1 如果没有  就直接return false就行

来写代码:

class Solution(object):def canJump(self, nums):i = 0while i < len(nums) - 1:if nums[i] == 0:# 从前面找能跨过这个0的人found = Falsefor j in range(i - 1, -1, -1):if nums[j] > i - j:found = Truebreakif not found:return Falsei += 1return True
solution=Solution()
result=solution.canJump([3,2,1,0,4]) 
print(result)

不要觉得晕啊 也不要考虑那么多 只要能往下走就证明没问题 (这个是我对我自己说的 虽然这个方法是通过测试的 但是我总是会担心中间什么数字会出什么岔子 这个是我的想法 )

然后我看有更好的方法,我们一起来学习一下

“目标更新法”(也叫贪心跳跃法),逻辑非常简洁,而且效率高。我们把目标点不断向前移动,只要当前位置能跳到目标,就把目标更新成当前位置,最后看目标是不是移动到了起点就行

class Solution(object):
def canJump(self, nums):
goal = len(nums) - 1  # 终点位置
for i in range(len(nums) - 2, -1, -1):  # 从倒数第二个元素往前遍历
if nums[i] >= goal - i:
goal = i  # 如果当前位置能跳到目标,更新目标为当前位置
return goal == 0  # 如果目标回到起点,说明可以跳到终点

[3,2,1,0,4] 从0开始 这个数值并不大于等于4-3 所以并不能从当前位置跳到目标  意思就是0这个是数字0 根本没办法到下一步 所以不行

意思就是我就看咱俩之间的距离长度 你这个数值够不够 如果你够了 证明你是可以来到我这个地方的 那么我不妨直接将终点移动到你那个位置 反正你是可以来的 就是去更新goal 看能不能更新到0 比如[2, 3, 1, 1, 4] 从1开始 二者之间可以 跳到1 也可以到1 3可以到1 继续移动 2可以到3 继续移动 

那么疑问?那这样的话会因为遇到0就直接导致不行了吗?其实是不会的 举个例子  7 8 0 2 4 

2大于等于 1 所以goal=3 0并不大于等于 1 继续往前 8>=3-2 所以现在跳到8的位置

所以意思其实是 如果咱俩之间现在可以跳 那我就往前跳 如果不能跳 那我就继续攒着 万一再前面来个大救星呢 就是走着走着发现这个数可以让我跳过来 那我就直接跳过来了 

感觉这样的题 自己想很难想出来 而且有的时候自己写出来了 也是会自我怀疑的 总觉得少了漏了 还是掌握的不好 代码真的和数学是息息相关的 

如果喜欢的话 欢迎点赞!

http://www.xdnf.cn/news/17241.html

相关文章:

  • app-3
  • 实习文档背诵
  • 2.1.4 砌体材料的性能与应用
  • SG105 Pro 网管交换机的3种VLAN配置
  • 强化应急通信生命线:遨游三防平板、卫星电话破局极端灾害救援
  • 无人机图传的得力助手:5G 便携式多卡高清视频融合终端的协同应用
  • Tdesign-React 请求接口 415 问题借助 chatmaster 模型处理记录
  • 嵌入式学习的第四十四天-ARM
  • 图解 Claude Code 子智能体 Sub-agent
  • CGAL Kernel 和 Traits 类深度解析:从官方教程到实践应用
  • 爆炸粒子效果
  • 记一次ORACLE ORA-00600 [19004] 错误的分析与解决方法
  • python每日一题 贪心算法
  • 【第6话:相机模型2】相机标定在自动驾驶中的作用、相机标定方法详解及代码说明
  • Python虚拟环境完全指南:pyenv vs venv 在macOS上的使用详解
  • 【代码随想录day 12】 力扣 102.107.199. 二叉树的层序遍历
  • SQL Server 2000企业管理器不能执行查询
  • cygwin+php教程(swoole扩展+redis扩展)
  • 利用DeepSeek改写并增强测试Duckdb和sqlite的不同插入方法性能
  • 高可用改造之构建​​双活冗余的TDengine时序数据处理架构
  • LeetCode——2411. 按位或最大的最小子数组长度
  • 浮动路由和BFD配置
  • 协同过滤基础——基线预测器(Baseline Predictors)
  • hyper-v实战系列:显卡虚拟化(GPU分区)--windows篇详解
  • Spring配置JDBC,使用JdbcTemplate套件和Druid套件
  • java回顾八股文中想起的知识点
  • Docker使用的常见问题
  • 开源密码恢复实用程序 Hashcat 7.0.0 发布
  • cf.训练
  • 数据结构 实现单链表