/leecode

Primary LanguageGo

一些算法代码

二分算法

旋转数组

扩展阅读 对一个排序的数组进行旋转, 我们可以注意到数组变成两个排序的子数组,并且前一个子数组的所有元素都大于后一个元素的子数组。 并且我们要查找的值,正是这两个数组的分界线。 采用二分法,我们可以判断中间元素是在前一个排序的子数组还是后一个子数组。

链表

扩展阅读

链表环问题 你需要明白,

  • 如果两个快指针最慢指针, 其快指针一定会追上的慢指针。
  • 如果快指针的速度为2, 慢指针的速度为1, 如果快慢指针距离为N, 那么在追上慢指针, 其中快指针走了2N, 慢指针走了N。

  • [对称二叉树]problem/对称二叉树.go)

二叉树的打印

字符串

Hash 表

并查集

扩展说明

主要操作:

  • 判断两个点是否在一个同一个集合里面
  • 合并两个集合(problem/merge) 其中判断两个节点的根节点相同,那么两个节点一定是在同一个节点上。

数论

经典算法

无序数组,找两个和为k的数 (problem/一次遍历怎么完成)

  • 先排序,然后用两个指针,一个指向头部, 一个指向尾部, 判断是否有两个和为sum
  • hash 表
  • 如果 sum 不大, 可以开一个sum数组, 来统计。

无序整数数组中找第k大的数

  • 先排序,然后输出第k大的数。
  • 快排, 对数据快速的分堆,然后根据堆的数量,递归的访问另一堆。
  • 二分搜索, 如果知道数组的最大和最小值, 可以二分搜索[min, max]
  • 堆排序,寻找第k大的数,适用于海量数据。
  • 键值索引法, 当 数组的数不大时, 可以统计每个数出现的次数,寻找k大值。