题目链接
分析
贪心
用哈希表统计每个数出现的次数,按降序排序
从大到小求和,超过数组长度一半时即得出答案
代码实现
class Solution {
public:
int minSetSize(vector<int>& arr) {
int ans = 0, n = arr.size() >> 1;
vector<int> v;
unordered_map<int, int> um;
for(int& i : arr)
um[i]++;
for(auto& [_, i] : um)
v.emplace_back(i);
ranges::sort(v, greater());
for(int i = 0; i < n; ++i) // 循环上界写着玩的,可以留空
{
if(v[i] >= n)
{
ans = i + 1;
break;
}
v[i + 1] += v[i];
}
return ans;
}
};
```cpp
class Solution {
public:
int minSetSize(vector<int>& arr) {
int ans = 0, n = arr.size() >> 1;
vector<int> v;
unordered_map<int, int> um;
for(int& i : arr)
um[i]++;
for(auto& [_, i] : um)
v.emplace_back(i);
ranges::sort(v, greater());
for(int i = 0; i < n; ++i) // 循环上界写着玩的,可以留空
{
if(v[i] >= n)
{
ans = i + 1;
break;
}
v[i + 1] += v[i];
}
return ans;
}
};
### 复杂度分析
- 时间复杂度:$O(n \log n)$,主要为排序耗时
- 空间复杂度:$O(n)$