【LeetCode 热题100】55:跳跃游戏(详细解析)(Go语言版)

简介: 本篇解析详细讲解了 LeetCode 热题 55——跳跃游戏(Jump Game)。通过判断是否能从数组起点跳至终点,介绍了两种高效解法:贪心算法和反向思维。贪心法通过维护最远可达位置 `maxReach` 实现一次遍历,时间复杂度 O(n),空间复杂度 O(1);反向法则从终点回溯,判断是否可到达起点。两者均简洁高效,适合面试使用。延伸题目如 LeetCode 45 进一步提升挑战。

🚀 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 := 0
    for 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) - 1
    for 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) 时间复杂度


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


目录
相关文章
|
4天前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
34 14
|
4天前
|
存储 算法 Go
【LeetCode 热题100】17:电话号码的字母组合(详细解析)(Go语言版)
LeetCode 17题解题思路采用回溯算法,通过递归构建所有可能的组合。关键点包括:每位数字对应多个字母,依次尝试;递归构建下一个字符;递归出口为组合长度等于输入数字长度。Go语言实现中,使用map存储数字到字母的映射,通过回溯函数递归生成组合。时间复杂度为O(3^n * 4^m),空间复杂度为O(n)。类似题目包括括号生成、组合、全排列等。掌握回溯法的核心思想,能够解决多种排列组合问题。
31 11
|
2天前
|
Go
【LeetCode 热题100】155:最小栈(详细解析)(Go语言版)
本文详细解析了力扣热题155:最小栈的解题思路与实现方法。题目要求设计一个支持 push、核心思路是使用辅助栈法,通过两个栈(主栈和辅助栈)来维护当前栈中的最小值。具体操作包括:push 时同步更新辅助栈,pop 时检查是否需要弹出辅助栈的栈顶,getMin 时直接返回辅助栈的栈顶。文章还提供了 Go 语言的实现代码,并对复杂度进行了分析。此外,还介绍了单栈 + 差值记录法的进阶思路,并总结了常见易错点,如 pop 操作时忘记同步弹出辅助栈等。
19 6
|
4天前
|
Go 索引
【LeetCode 热题100】739:每日温度(详细解析)(Go语言版)
这篇文章详细解析了 LeetCode 第 739 题“每日温度”,探讨了如何通过单调栈高效解决问题。题目要求根据每日温度数组,计算出等待更高温度的天数。文中推荐使用单调递减栈,时间复杂度为 O(n),优于暴力解法的 O(n²)。通过实例模拟和代码实现(如 Go 语言版本),清晰展示了栈的操作逻辑。此外,还提供了思维拓展及相关题目推荐,帮助深入理解单调栈的应用场景。
31 6
|
3月前
|
运维 监控 算法
监控局域网其他电脑:Go 语言迪杰斯特拉算法的高效应用
在信息化时代,监控局域网成为网络管理与安全防护的关键需求。本文探讨了迪杰斯特拉(Dijkstra)算法在监控局域网中的应用,通过计算最短路径优化数据传输和故障检测。文中提供了使用Go语言实现的代码例程,展示了如何高效地进行网络监控,确保局域网的稳定运行和数据安全。迪杰斯特拉算法能减少传输延迟和带宽消耗,及时发现并处理网络故障,适用于复杂网络环境下的管理和维护。
|
3月前
|
编译器 Go
揭秘 Go 语言中空结构体的强大用法
Go 语言中的空结构体 `struct{}` 不包含任何字段,不占用内存空间。它在实际编程中有多种典型用法:1) 结合 map 实现集合(set)类型;2) 与 channel 搭配用于信号通知;3) 申请超大容量的 Slice 和 Array 以节省内存;4) 作为接口实现时明确表示不关注值。此外,需要注意的是,空结构体作为字段时可能会因内存对齐原因占用额外空间。建议将空结构体放在外层结构体的第一个字段以优化内存使用。
|
3月前
|
存储 Go
Go 语言入门指南:切片
Golang中的切片(Slice)是基于数组的动态序列,支持变长操作。它由指针、长度和容量三部分组成,底层引用一个连续的数组片段。切片提供灵活的增减元素功能,语法形式为`[]T`,其中T为元素类型。相比固定长度的数组,切片更常用,允许动态调整大小,并且多个切片可以共享同一底层数组。通过内置的`make`函数可创建指定长度和容量的切片。需要注意的是,切片不能直接比较,只能与`nil`比较,且空切片的长度为0。
Go 语言入门指南:切片
|
3月前
|
算法 安全 Go
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
本文探讨了如何利用 Go 语言中的 Bloom Filter 算法提升公司局域网管理系统的性能。Bloom Filter 是一种高效的空间节省型数据结构,适用于快速判断元素是否存在于集合中。文中通过具体代码示例展示了如何在 Go 中实现 Bloom Filter,并应用于局域网的 IP 访问控制,显著提高系统响应速度和安全性。随着网络规模扩大和技术进步,持续优化算法和结合其他安全技术将是企业维持网络竞争力的关键。
82 2
公司局域网管理系统里的 Go 语言 Bloom Filter 算法,太值得深挖了
|
3月前
|
监控 Linux PHP
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
【02】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-2月12日优雅草简化Centos stream8安装zabbix7教程-本搭建教程非docker搭建教程-优雅草solution
114 20
|
3月前
|
开发框架 前端开发 Go
eino — 基于go语言的大模型应用开发框架(二)
本文介绍了如何使用Eino框架实现一个基本的LLM(大语言模型)应用。Eino中的`ChatModel`接口提供了与不同大模型服务(如OpenAI、Ollama等)交互的统一方式,支持生成完整响应、流式响应和绑定工具等功能。`Generate`方法用于生成完整的模型响应,`Stream`方法以流式方式返回结果,`BindTools`方法为模型绑定工具。此外,还介绍了通过`Option`模式配置模型参数及模板功能,支持基于前端和用户自定义的角色及Prompt。目前主要聚焦于`ChatModel`的`Generate`方法,后续将继续深入学习。
551 7

热门文章

最新文章