golang刷题常用代码
刷题常用技巧
- 双指针
- 二分查找
- 滑动窗口
- 前缀和
- 单调栈
- 字典树
- 并查集
不知道用啥的时候,可优先考虑搜索
数据结构
栈
type stack []interface{}
func (s *stack) empty() bool {
return len(*s) == 0
}
func (s *stack) length() int {
return len(*s)
}
func (s *stack) push(v interface{}) {
(*s) = append((*s), v)
}
func (s *stack) pop() interface{} {
r := (*s)[len((*s)) - 1]
(*s) = (*s)[:len((*s)) - 1]
return r
}
func (s *stack) peek() interface{} {
return (*s)[len((*s)) - 1]
}
队列
type queue []interface{}
func (s *queue) empty() bool {
return len(*s) == 0
}
func (s *queue) length() int {
return len(*s)
}
func (s *queue) offer(v interface{}) {
(*s) = append((*s), v)
}
func (s *queue) poll() interface{} {
r := (*s)[0]
(*s) = (*s)[1:]
return r
}
func (s *queue) peek() interface{} {
return (*s)[0]
}
排序
type slc [][]int
func (s *slc) Len() int {
return len(*s)
}
func (s *slc) Swap(i, j int) {
(*s)[i], (*s)[j] = (*s)[j], (*s)[i]
}
func (s *slc) Less(i, j int) bool {
a, b := (*s)[i], (*s)[j]
if a[0] > b[0] {
return true
} else if a[0] < b[0] {
return false
}
return a[1] < b[1]
}
快速排序
func sort(s *[]int, l, r int) {
if l < r { // key1 :l < r时 才进行排序
mid := partition(s, l, r)
sort(s, l, mid-1)
sort(s, mid+1, r)
}
}
func partition(s *[]int, l, r int) int {
pivot := (*s)[r] // key2 : pivot保存的时最右边的值
for l < r { // key3: 终止条件是l<r,那么终止时,l == r
for l < r && (*s)[l] <= pivot { //key4: 首先进行移动的,一定是和pivot相对应的方向
l++
}
(*s)[r] = (*s)[l]
for l < r && (*s)[r] >= pivot { //key5: 与pivot比较时,用>=, <=
r--
}
(*s)[l] = (*s)[r]
}
(*s)[l] = pivot // key6: 最后pivot赋值
return l
}
归并排序
func mergesort(s *[]int, l, r int, tmp *[]int) {
if l >= r {
return
}
mid := (l+r)/2
mergesort(s, l, mid, tmp)
mergesort(s, mid+1, r, tmp)
i, j, k := l, mid+1, 0
for i<=mid && j<=r {
if (*s)[i] <= (*s)[j] {
(*tmp)[k] = (*s)[i]
i++
} else {
(*tmp)[k] = (*s)[j]
j++
}
k++
}
for ;i<=mid; i++ {
(*tmp)[k] = (*s)[i]
k++
}
for ;j<=r; j++ {
(*tmp)[k] = (*s)[j]
k++
}
for i:=0; i<r-l+1; i++ {
(*s)[l+i] = (*tmp)[i]
}
}
小顶堆
type pqueue []int
func (pq *pqueue) Len() int {
return len(*pq)
}
func (pq *pqueue) Swap(i, j int) {
(*pq)[i], (*pq)[j] = (*pq)[j], (*pq)[i]
}
func (pq *pqueue) Less(i, j int) bool {
a, b := (*pq)[i], (*pq)[j]
return a < b
}
func (pq *pqueue) Push(v interface{}) {
*pq = append(*pq, v.(int))
}
func (pq *pqueue) Pop() interface{} {
t := (*pq)[len(*pq)-1]
*pq = (*pq)[:len(*pq)-1]
return t
}
// 使用方式
pq := &pqueue{}
heap.Init(pq)
heap.Push(pq, v)
heap.Pop(pq)