算法-前K個高頻元素
前K個高頻元素
給定一個非空的整數數組,返回其中出現頻率前 k 高的元素。
示例 1:
輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]
示例 2:
輸入: nums = [1], k = 1
輸出: [1]
說明:
你可以假設給定的 k 總是合理的,且 1 ≤ k ≤ 數組中不相同的元素的個數。
你的算法的時間複雜度必須優於 O(n log n) , n 是數組的大小。
這個題也算是一個有用的算法了,比如說熱搜?統計出現頻率最高的k個字符
其實本題也算是一個topK的題目,因此可以用堆實現。但是僅僅依靠堆是不夠的,因爲我們不知道每個元素出現的次數,所以我們用HashMap幫我們實現這一點:
public List<Integer> topKFrequent(int[] nums, int k) {
List<Integer> list=new LinkedList<>();
//統計詞頻
HashMap<Integer,Integer> map=new HashMap<>();
for (int n:nums){
if(!map.containsKey(n)){
map.put(n,1);
}else {
map.put(n,map.get(n)+1);
}
}
//重寫比較器,以詞的出現次數作爲比較器的比較項目
PriorityQueue<Integer> heap=new PriorityQueue<>((o1,o2)->map.get(o1)-map.get(o2));
for (Integer n:map.keySet()){
heap.offer(n);
if(heap.size()>k){
heap.poll();
}
}
while (heap.size()>0){
list.add(0,heap.poll());//頭插到結果集
}
return list;
}