
[LeetCode] Reduce Array Size to The Half

arr를 이루는 각 요소의 빈도를 계산해 frequencyMap에 저장한다.maxHeap에 해시맵의 값들(빈도)를 저장한다.removedElements에 더한다.setSize를 반환한다.class Solution {
public int minSetSize(int[] arr) {
Map<Integer, Integer> frequencyMap = new HashMap<>();
for (int num : arr) {
frequencyMap.put(num, frequencyMap.getOrDefault(num, 0) + 1);
}
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
for (int frequency : frequencyMap.values()) {
maxHeap.add(frequency);
}
int removedElements = 0;
int setSize = 0;
int halfSize = arr.length / 2;
while (removedElements < halfSize) {
removedElements += maxHeap.poll();
setSize++;
}
return setSize;
}
}
max에 저장한다.num을 인덱스로 배열 freq에 빈도를 카운트한다.count를 반환한다.class Solution {
public int minSetSize(int[] arr) {
int max = Integer.MIN_VALUE;
for(int num : arr){
max = Math.max(max, num);
}
int freq[] = new int[max+1];
for(int num : arr){
freq[num]++;
}
Arrays.sort(freq);
int i = max;
int n = arr.length;
int count = 0;
while(n > arr.length / 2){
n = n - freq[i];
i--;
count++;
}
return count;
}
}
- 기존 풀이와의 비교 결과
빈도 배열을 사용한 풀이가 최대힙을 사용한 코드보다 더 효율적인 시간 복잡도와 공간 복잡도를 가짐