一、題目描述
給定一個非空的整數數組,返回其中出現頻率前 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 是數組的大小。
二、解題思路
1、先使用哈希表,記錄下數組中每個元素出現的次數。我這裏用hashmap。
2、再使用小頂堆,將哈希表中的key入堆,如果對的大小大於了k,則拋出堆頂元素
3、再遍歷堆,用list接住,並返回。
三、java代碼
class Solution {
public List<Integer> topKFrequent(int[] nums, int k) {
//使用哈希表 和 小頂堆
HashMap<Integer, Integer> count = new HashMap<>();
for (int n : nums) {
count.put(n, count.getOrDefault(n, 0)+1);
}
PriorityQueue<Integer> heap = new PriorityQueue<>((n1, n2) -> (count.get(n1)-count.get(n2)));
for (int n : count.keySet()) {
heap.add(n);
if(heap.size()>k){
heap.poll();
}
}
List<Integer> list = new ArrayList<Integer>();
while (!heap.isEmpty()){
list.add(heap.poll());
}
return list;
}
}