Golang LeetCode 刷题必备基础和常用模板
Golang LeetCode 刷题必备基础备忘录
1. 基础数据结构用法
数组/切片 (Slice)
1 | // 初始化 |
字符串 (String)
1 | // 基本操作 |
映射 (Map)
1 | m := make(map[string]int) |
链表 (List)
1 | import "container/list" |
2. 常用算法模板
二分查找
1 | func binarySearch(nums []int, target int) int { |
快速排序
1 | func quickSort(nums []int) { |
3. 标准库重要包
sort
排序包
1 | import "sort" |
container/heap
堆实现
1 | import "container/heap" |
math
数学包
1 | import "math" |
4. 并发编程基础
Goroutine
1 | go func() { |
Channel
1 | ch := make(chan int, 10) // 缓冲通道 |
5. 常用技巧
位运算
1 | n & 1 // 判断奇偶 |
常用常量
1 | const INT_MAX = int(^uint(0) >> 1 |
快速输入输出 (竞赛用)
1 | import ( |
6. 测试用例写法
1 | import "testing" |
7. 常见题型解题要点
- 双指针:数组/链表问题,滑动窗口
- DFS/BFS:树/图遍历,回溯问题
- 动态规划:状态转移方程,备忘录
- 贪心算法:局部最优解
- 并查集:连通性问题
- 前缀和/差分数组:区间查询/更新
- 单调栈:下一个更大/小元素问题
1. 双指针技巧
数组/链表问题模板
1 | // 快慢指针找链表中点 |
滑动窗口模板
1 | func slidingWindow(s string) int { |
2. DFS/BFS 算法
树遍历模板
1 | // DFS 递归遍历 |
回溯算法模板
1 | func backtrack(nums []int) [][]int { |
3. 动态规划
经典DP模板
1 | // 斐波那契数列 (备忘录) |
4. 贪心算法
区间调度问题
1 | func intervalSchedule(intervals [][]int) int { |
5. 并查集
标准实现
1 | type UnionFind struct { |
6. 前缀和与差分数组
前缀和模板
1 | // 一维前缀和 |
7. 单调栈
下一个更大元素
1 | func nextGreaterElements(nums []int) []int { |
柱状图中最大矩形
1 | func largestRectangleArea(heights []int) int { |
各题型解题要点总结
双指针:
- 数组问题:注意有序数组的特殊性质
- 滑动窗口:明确窗口收缩条件,维护窗口状态
DFS/BFS:
- 树遍历:前中后序选择取决于问题需求
- 回溯:注意状态恢复,剪枝优化
动态规划:
- 明确状态定义和转移方程
- 考虑空间优化(滚动数组)
贪心算法:
- 证明贪心选择的正确性
- 通常需要先排序
并查集:
- 路径压缩和按秩合并优化
- 处理连通分量问题
前缀和/差分:
- 前缀和用于快速区间查询
- 差分数组用于快速区间更新
单调栈:
- 维护栈内元素的单调性
- 用于解决”下一个更大/小元素”类问题
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Lei Qi's Blog!
评论