leetcode#575 分糖果

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);
    }
};
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值