diff --git a/solutions/347. Top K Frequent Elements.md b/solutions/347. Top K Frequent Elements.md index 8c603db..de9e9ae 100644 --- a/solutions/347. Top K Frequent Elements.md +++ b/solutions/347. Top K Frequent Elements.md @@ -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定义成元素值。