中等题清单
一句话说明
中等题真正考的是“你能不能快速识别题型并选对套路”,而不是把代码写长。
重点专题
- 双指针与滑动窗口
- 二分查找变体
- DFS / BFS
- 回溯
- 一维 / 二维 DP
- 链表综合操作
典型题型
| 专题 | 代表题 | 关键词 |
|---|---|---|
| 数组 | 三数之和、合并区间 | 排序、双指针 |
| 链表 | 删除倒数第 N 个、重排链表 | 快慢指针 |
| 树 | 层序遍历、构造树、LCA | 递归、BFS |
| DP | 最长回文、零钱兑换、LIS | 状态定义 |
| 回溯 | 全排列、组合总和 | 剪枝、去重 |
一个代表性 Go 模板:三数之和
func threeSum(nums []int) [][]int {
sort.Ints(nums)
result := [][]int{}
for i := 0; i < len(nums)-2; i++ {
if i > 0 && nums[i] == nums[i-1] {
continue
}
left, right := i+1, len(nums)-1
for left < right {
sum := nums[i] + nums[left] + nums[right]
if sum == 0 {
result = append(result, []int{nums[i], nums[left], nums[right]})
for left < right && nums[left] == nums[left+1] {
left++
}
for left < right && nums[right] == nums[right-1] {
right--
}
left++
right--
} else if sum < 0 {
left++
} else {
right--
}
}
}
return result
}一个代表性 Go 模板:二维 DP
func uniquePaths(m, n int) int {
dp := make([][]int, m)
for i := range dp {
dp[i] = make([]int, n)
dp[i][0] = 1
}
for j := 0; j < n; j++ {
dp[0][j] = 1
}
for i := 1; i < m; i++ {
for j := 1; j < n; j++ {
dp[i][j] = dp[i-1][j] + dp[i][j-1]
}
}
return dp[m-1][n-1]
}刷题建议
- 中等题要开始系统做专题总结
- 一道题至少想清楚“状态 / 不变量 / 去重规则”
- 如果一种题型连续错两次,就应该回到模板页重练
返回:LeetCode题解