Given an array of integers arr
and an integer k
. Find the least number of unique integers after removing exactly k
elements.
Example 1:
Input: arr = [5,5,4], k = 1 Output: 1 Explanation: Remove the single 4, only 5 is left.
Example 2:
Input: arr = [4,3,1,1,3,3,2], k = 3 Output: 2 Explanation: Remove 4, 2 and either one of the two 1s or three 3s. 1 and 3 will be left.
Constraints:
1 <= arr.length <= 10^5
1 <= arr[i] <= 10^9
0 <= k <= arr.length
// OJ: https://leetcode.com/problems/least-number-of-unique-integers-after-k-removals/
// Author: github.com/lzl124631x
// Time: O(N + UlogU) where U is the number of unique counts
// Space: O(N)
class Solution {
public:
int findLeastNumOfUniqueInts(vector<int>& A, int k) {
unordered_map<int, int> cnt;
for (int n : A) cnt[n]++;
map<int, int> m;
for (auto &p : cnt) m[p.second]++;
int ans = cnt.size();
for (auto &p : m) {
int n = min(p.second, k / p.first);
if (n == 0) break;
ans -= n;
k -= p.first * n;
}
return ans;
}
};