Top K类型题(bucket sort, inplace quick sort and Comparator)

Top K类型题(bucket sort, inplace quick sort and Comparator)

基本类top k

今天总结了一下Top K这种类型的题目的做法,总的来说一般有三种做法:

  • 最简单的就是进行sorting,然后取前K个,时间复杂度是O(nlogn)
  • 第二种做法是使用Priority Queue(最小堆),Priority Queue只存储目前遇到的最大的K个元素,每次堆中元素大于K的时候我们就poll出目前最小的元素(已经有K个比他大,他肯定不是结果了),那么时间复杂度是O(nlogk)
  • 最复杂的做法是使用Quick Select,由于我们只关心前K个元素,所以相当于对于Quick Sort,我们每次partition只取一半,所以时间复杂度只有O(n)。(T(n) = T(n/2) + n)

注意:当我们是求某一个频率的前K个元素的时候,我们可以不用复杂的Quick Select,而是使用简单的Bucket sort。这里能够使用bucket sort的原因在于元素的frequency肯定不大于数组的长度,也就是说有一个固定的边界。我们知道bucket sort能够使用的条件就是有固定的边界。而求取前K个最大的元素,由于元素的大小是没有边界的,所以无法使用bucket sort,我们只能用Quick Select。

Read more

区间问题总结

Interval类型题

Interval类型的题目很烧脑,这里尽量总结一下,要多复习。

https://zhuanlan.zhihu.com/p/26657786

这种题的思路是:1.由于本身start和end都是无序的,所以第一步是先要针对start或者end进行排序,具体针对start还是end需要具体问题具体分析,一般来说针对start进行排序的情况比较多;2.对于已经排好序的数组使用greedy

https://www.1point3acres.com/bbs/thread-432526-1-1.html
我的体验是, 如果能改成类似经典问题的话 [寻找最多non overlapping interval]类型的题目,就是按end排序。 按end排序只> 需要考虑一个情况就是[3,5],[7,8],[1,10]这样。 如果这个是个反例,那得考虑start排序。

  1. 646 + 435 + 452
  2. 253 + 253
  3. 56 + 57
Read more