大厂喜欢考察的TopK问题有多少陷阱在里面?

257 阅读2分钟

前言

我整理了一下求top问题的相关leetcode习题集

215. 数组中的第K个最大元素

剑指 Offer 40. 最小的k个数

剑指 Offer II 059. 数据流的第 K 大数值

剑指 Offer II 076. 数组中的第 k 大的数字

347. 前 K 个高频元素

692. 前K个高频单词

分析

对于此类问题通常分为如下几类

1)问题1: 已知数据的长度,求topK

2)问题2: 数据的长度无限,求topK

3)问题3: 求第k个高频的元素

此类问题的难点是什么呢?

不光是要回答解法,还需要回答其时间复杂度和空间复杂度,以及是如何推导的。

其次,要搞清楚,是否是数据流(面试官往往问的很模糊,你需要确认清楚),如果是数据流的话,那么只能用优先队列来求解。

重点是你需要知道如下几个知识点(不清楚的自行百度)

1)优先队列,新增一个元素的时间复杂度是多少? O(logK)

  1. 维护一个优先队列,需要的空间复杂度是多少 O(K)

  2. 快速排序1次拆分的最大时间复杂度是多少? O(n)

  3. 快速排序分治法迭代完成的平均复杂度是多少? O(log(n))

对于1的话,有如下几种解法。(注意面试官要求的复杂度是多少)

1)快速排序 quickSort

2)优先队列

3)快速选择排序 quickSelect

4)自己建堆,使用堆排序

对于2,解法只有1种

1)优先队列

对于3,它可以先通过一次遍历把数据的key和频次放到map中,然后再转换成求频次的topK, 解法有2种

1)优先队列

  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 指的是优先级队列插入和删除的复杂度