Table of Contents
Problem Statement
The Least Number of Unique Integers after K Removals LeetCode Solution – “Least Number of Unique Integers after K removals” states that you’re given an array of integers and an integer k. Find the least number of unique integers after removing exactly k
elements.
Example:
Input: arr = [5,5,4], k = 1
Output: 1
Explanation:
- Since k = 1, we will remove exactly 1 element.
- Removing a single 5 will give the array as [5,4]. So a number of unique elements are 2.
- Removing a single 4 will give the array as [5,5]. So a number of unique elements are 1.
- Hence, removing 4 is optimal since it yields a minimum number of unique elements which is 1.
- The answer is 1.
Input: arr = [4,3,1,1,3,3,2], k = 3
Output: 2
Explanation:
- Since k = 3 we will remove exactly three elements from the input array such that a number of unique elements will be minimized.
- We can easily observe that removing [4,2,1] will give exactly 2 distinct elements which is the minimum answer possible.
Approach
Idea:
- The main idea to solve this problem efficiently is to use (Greedy Approach).
- Store all the unique elements frequencies of the given array in the frequency table.
- Since we have to minimize the number of distinct elements after removing k elements so, we’ll start from those elements which have a minimum frequency in the given array.
- Hence, we need to sort the unique elements and their frequencies in non-decreasing order of their frequencies.
- Start with the elements which have minimum frequency and decrease the value of K with the minimum frequency and discard the current element. Repeat the same step till k is positive.
- A number of distinct elements that are left after the above operations are done repeatedly till k is positive, is our answer.
Code
C++ Least Number of Unique Integers after K removals String Leetcode Solution:
class Solution { public: int findLeastNumOfUniqueInts(vector<int>& arr, int k) { unordered_map<int,int> freq; for(auto& num:arr){ freq[num]++; } vector<pair<int,int>> store; for(auto& x:freq){ store.push_back({x.second,x.first}); } sort(store.rbegin(),store.rend()); while(k>0){ int required = min(k,store.back().first); k-=required; store.back().first-=required; if(!store.back().first){ store.pop_back(); } } return store.size(); } };
Java Least Number of Unique Integers after K removals Leetcode Solution:
class Solution { public int findLeastNumOfUniqueInts(int[] arr, int k) { Map<Integer, Integer> freq = new HashMap<>(); for (int a : arr){ freq.put(a, 1 + freq.getOrDefault(a, 0)); } int len = freq.size(); TreeMap<Integer, Integer> occ = new TreeMap<>(); for (int v : freq.values()){ occ.put(v, 1 + occ.getOrDefault(v, 0)); } while(k>0){ Map.Entry<Integer,Integer> entry = occ.pollFirstEntry(); if(k-entry.getKey()*entry.getValue()>=0){ k -= entry.getKey()*entry.getValue(); len -= entry.getValue(); } else{ return len - k / entry.getKey(); } } return len; } }
Complexity Analysis for Least Number of Unique Integers after K removals Leetcode Solution
Time Complexity
The time complexity of the above code is O(N + MlogM + K) where N = length of the input array and M = number of unique elements.
Space Complexity
The space complexity of the above code is O(M), where M = number of unique elements in the input array.