Reduce Array Size to At Least Half

Sanjeev SharmaSanjeev Sharma
1 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro