Update 347. Top K Frequent Elements.md

This commit is contained in:
ShusenTang 2019-12-11 20:24:14 +08:00 committed by GitHub
parent 1c3d9b07bf
commit 2adb057f3f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -11,10 +11,10 @@
* 若新来的频次比堆顶大说明堆顶的频次应该被淘汰并将新来的频次push进堆
* 否则说明新来的频次不够大,那跳过即可。
注意堆的size始终是k所以每次从堆顶删除元素和插入元素复杂度都是O(k)有大约n次操作所以复杂度为O(nlogk)。
注意堆的size始终是k初始建堆复杂度O(k)每次从堆顶删除元素和插入元素复杂度都是O(k)有大约n次操作所以时间复杂度为O(nlogk)空间复杂度O(k)。
几个注意点:
* 不能用最大堆!!! 用最大堆要先把所有元素都加入堆堆大小就为n再不断pop出k个元素虽然结果是对的但是由于堆大小为n级别所以建堆的n次插入复杂度为O(nlogn)。
* 也可以用最大堆但是需要注意的是用最大堆要先把所有元素都加入堆堆大小就为n再不断pop出k个元素。由于堆大小为n级别所以建堆复杂度为O(n)总的时间复杂度为O(n + klogn)空间复杂度O(n)。**当n很大时用最大堆是不好的将耗费大量空间。**
* STL中堆用`priority_queue`实现,不过默认是最大堆,这里我们需要最小堆,需要传入`greater`类(而不是函数)。
* 代码实现中堆的元素是一个pair, 由于pair排序默认对first排序所以first我们定义成频次second定义成元素值。