题目:给一个非空数组,求数组中出现次数最多的k个元素。例如给出数组[1, 1, 1, 2, 2, 3]和k=2,返回[1, 2]
思路1
使用HashMap来对数组中的元素计数并存储,然后使用HashMap中的value构造大顶堆,取k次大顶堆的堆顶元素,同时调整大顶堆堆,取出value对应的key值。
|
|
时间复杂度O(N+klgk+(N-k)lgk) = O(Nlgk),N:遍历数组,klgk:建堆,(N-k)lgk:剩余N-k个元素插入堆
思路二
使用桶排序的思想,将出现次数为count的元素放入bucket[count]中,然后从bucket的index从大到小遍历。(这里需要注意的是有些出现次数一样的元素,所以我们的bucket数组需要定义成集合数组)
时间复杂度O(n)空间换时间