575. 分糖果
# 哈希
题目描述
Alice 有 n
枚糖,其中第 i
枚糖的类型为 candyType[i]
。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。
医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2
即可(n
是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。
给你一个长度为 n
的整数数组 candyType
,返回: Alice 在仅吃掉 n / 2
枚糖的情况下,可以吃到糖的 最多 种类数。
题解
无序集合
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
int n = candyType.size();
unordered_set<int> usi(candyType.begin(), candyType.end());
return min(int(usi.size()), n/2);
}
};
位集合
求集合大小
- 查找糖果种类是否存在,使用哈希
- 不计数,只需1bit,用位存储
数据结构
bitset
是C++标准库中的一个模板类,用于表示和操作定长的位集合。与vector<bool>
相比,bitset
在存储和操作位方面更加高效,因为它是专门为位操作设计的。bitset
在需要处理二进制数据、位掩码或实现类似布尔数组的场景中非常有用。
常用操作
set(n); // 将第n位置1
set(); // 将所有位置1
reset(n); // 将第n位清除(置0)
reset(); // 将所有位清除
flip(n); // 翻转第n位
flip(); // 翻转所有位
bool test(n); // 测试第n位是否为1
算法
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
bitset<200001> bs;
for(const int& i : candyType){
bs.set(i + 100000);
}
return min(bs.count(), candyType.size() / 2);
}
};