🥰个人主页:会编程的土豆(欢迎来访)
💎作者简介:后端学习者
✨那些你一个人走过的夜路,终将化作照亮未 来的光



本文覆盖力扣「热题 100」学习计划前 5 题,全部使用 Go 实现。适合作为刷题笔记直接收藏。
题单入口:LeetCode 热题 100
1. 两数之和
难度: 简单
标签: 数组、哈希表
题目链接: 1. 两数之和
题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。可以按任意顺序返回答案。
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
思路分析
暴力枚举两层循环是 O(n²)。更好的做法是用 哈希表:
- 遍历到
nums[i]时,在哈希表中查找是否存在target - nums[i] - 若存在,直接返回两个下标
- 若不存在,把
nums[i]和下标i放入哈希表
只遍历一次数组,时间复杂度 O(n)。
Go 代码
func twoSum(nums []int, target int) []int {
indexMap := make(map[int]int)
for i, num := range nums {
if j, ok := indexMap[target-num]; ok {
return []int{j, i}
}
indexMap[num] = i
}
return nil
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
49. 字母异位词分组
难度: 中等
标签: 数组、哈希表、字符串、排序
题目链接: 49. 字母异位词分组
题目描述
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的所有字母得到的一个新单词。
示例:
输入: strs = ["eat","tea","tan","ate","nat","bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
思路分析
字母异位词排序后会得到相同字符串,因此:
- 对每个字符串排序,得到 key
- 用
map[string][]string把相同 key 的原串归到同一组
也可以用长度为 26 的字符计数数组作为 key,避免排序,这里用排序写法更直观。
Go 代码
func groupAnagrams(strs []string) [][]string {
groups := make(map[string][]string)
for _, s := range strs {
b := []byte(s)
sort.Slice(b, func(i, j int) bool {
return b[i] < b[j]
})
key := string(b)
groups[key] = append(groups[key], s)
}
res := make([][]string, 0, len(groups))
for _, g := range groups {
res = append(res, g)
}
return res
}
记得导入:
import "sort"
复杂度
- 时间复杂度:O(n · k log k),n 为字符串个数,k 为字符串平均长度
- 空间复杂度:O(n · k)
128. 最长连续序列
难度: 中等
标签: 并查集、数组、哈希表
题目链接: 128. 最长连续序列
题目描述
给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。
请你设计并实现时间复杂度为 O(n) 的算法解决此问题。
示例:
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。
思路分析
若先排序再扫一遍是 O(n log n)。要达到 O(n):
- 把所有数字放进哈希集合
- 只从「序列起点」开始数:若
x-1不在集合中,说明x是起点 - 从
x开始不断查x+1, x+2, ...,统计长度并更新答案
每个数字最多被访问常数次,整体仍是 O(n)。
Go 代码
func longestConsecutive(nums []int) int {
set := make(map[int]struct{}, len(nums))
for _, num := range nums {
set[num] = struct{}{}
}
longest := 0
for num := range set {
// 不是起点则跳过
if _, ok := set[num-1]; ok {
continue
}
cur := num
length := 1
for {
if _, ok := set[cur+1]; !ok {
break
}
cur++
length++
}
if length > longest {
longest = length
}
}
return longest
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(n)
283. 移动零
难度: 简单
标签: 数组、双指针
题目链接: 283. 移动零
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
思路分析
使用快慢双指针:
slow指向下一个非零元素应放的位置fast遍历整个数组- 遇到非零就与
nums[slow]交换,然后slow++
这样非零元素相对顺序不变,零自然被挤到后面。
Go 代码
func moveZeroes(nums []int) {
slow := 0
for fast := 0; fast < len(nums); fast++ {
if nums[fast] != 0 {
nums[slow], nums[fast] = nums[fast], nums[slow]
slow++
}
}
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
11. 盛最多水的容器
难度: 中等
标签: 贪心、数组、双指针
题目链接: 11. 盛最多水的容器
题目描述
给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
示例:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
思路分析
左右双指针从两端向中间夹逼:
- 当前面积 =
min(height[left], height[right]) * (right - left) - 每次移动 较矮 的那一侧:因为宽度一定变小,只有变高才可能让面积更大
这样可以把 O(n²) 暴力降到 O(n)。
Go 代码
func maxArea(height []int) int {
left, right := 0, len(height)-1
maxWater := 0
for left < right {
h := height[left]
if height[right] < h {
h = height[right]
}
area := h * (right - left)
if area > maxWater {
maxWater = area
}
if height[left] < height[right] {
left++
} else {
right--
}
}
return maxWater
}
复杂度
- 时间复杂度:O(n)
- 空间复杂度:O(1)
小结
| 题目 | 核心技巧 | 时间复杂度 |
|---|---|---|
| 两数之和 | 哈希表一次遍历 | O(n) |
| 字母异位词分组 | 排序后的串作 key | O(n·k log k) |
| 最长连续序列 | Set + 只从起点扩展 | O(n) |
| 移动零 | 快慢双指针 | O(n) |
| 盛最多水的容器 | 左右指针夹逼 | O(n) |
下一篇会继续写 三数之和、接雨水、无重复字符的最长子串、找到所有字母异位词、和为 K 的子数组,同样全部用 Go 实现。
如果这篇对你有帮助,欢迎点赞收藏,一起把 Hot100 刷完!