您的位置:首页 > 科技 > 能源 > 绵阳建设股份有限公司_高级seo_北京seo网络优化师_cpc广告点击日结联盟

绵阳建设股份有限公司_高级seo_北京seo网络优化师_cpc广告点击日结联盟

2025/4/12 22:55:08 来源:https://blog.csdn.net/qq_47831505/article/details/147018023  浏览:    关键词:绵阳建设股份有限公司_高级seo_北京seo网络优化师_cpc广告点击日结联盟
绵阳建设股份有限公司_高级seo_北京seo网络优化师_cpc广告点击日结联盟

🚀 LeetCode 热题 55:跳跃游戏(Jump Game)完整解析

📌 题目描述

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

🎯 示例 1:

输入:nums = [2,3,1,1,4]
输出:true
解释:从位置 0 跳到位置 1(跳 1 步),然后跳 3 步到最后一个位置。

🎯 示例 2:

输入:nums = [3,2,1,0,4]
输出:false
解释:无论怎样都无法越过位置 3。

💡 解题思路

✅ 方法一:贪心法(Greedy)

  • **核心思想:**我们维护一个变量 maxReach 表示当前能到达的最远位置。
  • 每遍历一个位置 i,判断 i 是否在 maxReach 可达范围内。
    • 如果 i > maxReach:说明当前位置无法到达,直接返回 false。
    • 否则,更新最远可达距离:maxReach = max(maxReach, i + nums[i])
  • 最后判断是否能到达末尾。

💻 Go 实现:贪心算法

func canJump(nums []int) bool {maxReach := 0for i := 0; i < len(nums); i++ {if i > maxReach {return false}maxReach = max(maxReach, i+nums[i])}return true
}func max(a, b int) int {if a > b {return a}return b
}

✅ 方法二:反向思维(从后往前跳)

  • 从末尾开始找,看是否能“跳”回起点。
  • 设置一个变量 lastPos,表示最早可以到达终点的位置。
  • 倒序遍历数组,如果 i + nums[i] >= lastPos,说明可以从 i 位置跳到 lastPos,更新 lastPos = i
  • 最后判断 lastPos 是否为 0,表示起点可达终点。
func canJump(nums []int) bool {lastPos := len(nums) - 1for i := len(nums) - 2; i >= 0; i-- {if i+nums[i] >= lastPos {lastPos = i}}return lastPos == 0
}

🧠 方法对比

方法优点缺点时间复杂度空间复杂度
贪心简洁高效、一次遍历无法记录路径O(n)O(1)
反向更直观判断是否能跳回起点不如贪心精简O(n)O(1)

⏳ 复杂度分析

  • 时间复杂度: O(n),只需遍历数组一次。
  • 空间复杂度: O(1),只用了常数级别的变量。

🎯 总结

  • 本题的本质是动态规划的简化——局部最优推全局最优。
  • 贪心策略是最快的解法:只关注“能跳到多远”。
  • 如果面试中遇到此题,建议首选贪心法,简单高效。
  • 💡 延伸题目:LeetCode 45. 跳跃游戏 II 是本题的进阶版本。

🧩 关键词回顾:

贪心算法、最远跳跃、局部最优、反向思维、动态规划简化、O(n) 时间复杂度


📌 如果你觉得这篇解析对你有帮助,欢迎点赞 👍、收藏 ⭐、评论 💬 交流,一起刷题进阶 🚀!


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com