1338. 数组大小减半
给你一个整数数组 arr。你可以从中选出一个整数集合,并删除这些整数在数组中的每次出现。
返回至少能删除数组中的一半整数的整数集合的最小大小。
题解思路:
只需要记录每个元素在arr中出现的次数,将次数排序,从出现次数最多的数开始删除,累加被删除的数出现的次数,直到大于等于arr的长度的一半。不需要真的删除数据,只需要记录被删除的数据出现的次数即可。
class Solution {
public:
int minSetSize(vector<int>& arr) {
unordered_map<int, int> mp;
for(int i = 0; i < arr.size(); i++){
mp[arr[i]]++;
}
vector<int> v;
for(unordered_map<int, int> ::iterator it = mp.begin(); it != mp.end(); it++){
v.push_back(it->second);
}
sort(v.begin(), v.end());
int ans = 0, len = arr.size();
for(int i = v.size() - 1; i >= 0; i--){
ans++;
len -= v[i];
if(len <= arr.size() / 2){
break;
}
}
return ans;
}
};