解题思路:
(1)记录每个数字出现的次数,从大到小排序
(2)遍历相加,判断之和是否大于等于数组的一般长度
class Solution {
public:
int minSetSize(vector<int>& arr) {
int len = arr.size()/2;
unordered_map<int,int> mp;
for(int i=0;i<arr.size();i++) {
mp[arr[i]]++;
}
vector<pair<int,int>> v;
for(auto it=mp.begin();it!=mp.end();it++) {
v.push_back(pair(it->first,it->second));
}
auto comp=[&](pair<int,int> a,pair<int,int> b) {
if(a.second>b.second) return true;
else return false;
};
sort(v.begin(),v.end(),comp);
int sum=0;
for(int i=0;i<v.size();i++) {
sum+=v[i].second;
if(sum>=len) {
return i+1;
}
}
return -1;
}
};