Reduce Array Size to At Least Half
Advertisement
Problem
Find the minimum number of distinct values whose removal results in at least 50% size reduction.
Solutions
# Python
from collections import Counter
import heapq
def minSetSize(arr):
count = Counter(arr)
heap = [-v for v in count.values()]
heapq.heapify(heap)
removed = 0
target = len(arr) // 2
result = 0
while removed < target:
removed -= heapq.heappop(heap)
result += 1
return result
// C++
int minSetSize(vector<int>& arr) {
unordered_map<int,int>cnt; for(int n:arr)cnt[n]++;
priority_queue<int>maxH; for(auto&[v,f]:cnt)maxH.push(f);
int removed=0,res=0,target=arr.size()/2;
while(removed<target){removed+=maxH.top();maxH.pop();res++;}
return res;
}
// Java
public int minSetSize(int[] arr) {
Map<Integer,Integer>cnt=new HashMap<>();for(int n:arr)cnt.merge(n,1,Integer::sum);
PriorityQueue<Integer>maxH=new PriorityQueue<>(Collections.reverseOrder());
maxH.addAll(cnt.values());
int removed=0,res=0,target=arr.length/2;
while(removed<target){removed+=maxH.poll();res++;}
return res;
}
// JavaScript
function minSetSize(arr) {
const cnt = new Map();
for (const n of arr) cnt.set(n, (cnt.get(n)||0)+1);
const freqs = [...cnt.values()].sort((a,b)=>b-a);
let removed=0,res=0,target=arr.length/2;
for(const f of freqs){removed+=f;res++;if(removed>=target)break;}
return res;
}
Complexity
- Time: O(n log n), Space: O(n)
Advertisement