前言
我整理了一下求top问题的相关leetcode习题集
分析
对于此类问题通常分为如下几类
1)问题1: 已知数据的长度,求topK
2)问题2: 数据的长度无限,求topK
3)问题3: 求第k个高频的元素
此类问题的难点是什么呢?
不光是要回答解法,还需要回答其时间复杂度和空间复杂度,以及是如何推导的。
其次,要搞清楚,是否是数据流(面试官往往问的很模糊,你需要确认清楚),如果是数据流的话,那么只能用优先队列来求解。
重点是你需要知道如下几个知识点(不清楚的自行百度)
1)优先队列,新增一个元素的时间复杂度是多少? O(logK)
-
维护一个优先队列,需要的空间复杂度是多少 O(K)
-
快速排序1次拆分的最大时间复杂度是多少? O(n)
-
快速排序分治法迭代完成的平均复杂度是多少? O(log(n))
对于1的话,有如下几种解法。(注意面试官要求的复杂度是多少)
1)快速排序 quickSort
2)优先队列
3)快速选择排序 quickSelect
4)自己建堆,使用堆排序
对于2,解法只有1种
1)优先队列
对于3,它可以先通过一次遍历把数据的key和频次放到map中,然后再转换成求频次的topK, 解法有2种
1)优先队列
- 基于快速排序优化的快速选择排序
下面我只讲问题1,不贴代码,只说复杂度的结论
快速排序
优先队列
- O(N lg K) running time
- O(K) memory
随机化的快速选择排序
- O(N) best case / O(N^2) worst case running time
- O(1) memory
除了上面说的,还有哪些坑呢?
1)快速排序和快速选择不能划等号,如果面试官说快速排序求解的复杂度,那就回答 O(n lg n)
2)优先队列的复杂度O(N lg K),有些人喜欢忘记lg K,K是不能被忽略的,lg K 指的是优先级队列插入和删除的复杂度