#문제 설명
Leetcode 347번 문제는 array와 정수 k가 주어진다. 배열에서 가장 빈도가 높은 k개의 요소를 return하면된다. 예를 들어 [1,1,1,2,2,3]이 라는 배열에 k=2가 주어지면 1 (빈도 3번) 과 2 (빈도 2번)을 반환해주면 된다. 만약 k=3이라면 1,2,3 모두 반환 해주면 된다
#문제 풀이
class Solution {
public int[] topKFrequent(int[] nums, int k) {
// O(1) time
if (k == nums.length) {
return nums;
}
// 1. build hash map : character and how often it appears
// O(N) time
Map<Integer, Integer> count = new HashMap();
for (int n: nums) {
count.put(n, count.getOrDefault(n, 0) + 1);
}
// init heap 'the less frequent element first'
Queue<Integer> heap = new PriorityQueue<>(
(n1, n2) -> count.get(n1) - count.get(n2));
// 2. keep k top frequent elements in the heap
// O(N log k) < O(N log N) time
for (int n: count.keySet()) {
heap.add(n);
if (heap.size() > k) heap.poll();
}
// 3. build an output array
// O(k log k) time
int[] top = new int[k];
for(int i = k - 1; i >= 0; --i) {
top[i] = heap.poll();
}
return top;
}
}
'LeetCode > Heap' 카테고리의 다른 글
[Medium] 703. Kth Largest Element in a Stream (아마존 코딩 테스트 기출 문제) (0) | 2024.04.03 |
---|---|
[Hard] 295. Find Median from Data Stream (Microsoft 기출 문제) (0) | 2022.10.13 |
[Medium] 451. Sort Characters By Frequency (0) | 2022.10.11 |
[Medium] 1046. Last Stone Weight (구글 코딩 테스트 기출문제) (0) | 2022.10.06 |
[Medium] Kth Largest Element in an Array (아마존/구글) (0) | 2022.10.02 |