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]
    }
}

小顶堆

253. 会议室 II

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)
posted @ 2020-08-15 02:11  holidays  阅读(319)  评论(0编辑  收藏  举报