Leetcode刷题48-575. 分糖果(C++详细解法!!!)

题目来源:链接: [https://leetcode-cn.com/problems/distribute-candies/].

1.问题描述

给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

示例1:

输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。
     最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。

示例2:

输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。

说明:

1. 数组的长度为[2, 10,000],并且确定为偶数。
2. 数组中数字的大小在范围[-100,000, 100,000]内

2.我的解决方案

easy 类型题目
使用了 set 容器去重,又因为要保证 两个人 最终拿到的糖果数量 相同。(平均分糖果
则:1. 若 糖果的种类 大于 candies数量的一半,则返回 candies数量的一半。
2. 若 糖果的种类 小于 candies数量的一半,则返回 set容器中的数量。

class Solution {
public:
    int distributeCandies(vector<int>& candies) {
        set<int> res;   //去重
        for(auto c : candies)
        {
            res.insert(c);
        }
        if(res.size() > candies.size()/2)
        {  //若 糖果的种类 大于 candies数量的一半,则返回 candies数量的一半
            return candies.size()/2;
        }
        else
        {  //若 糖果的种类 小于 candies数量的一半,则返回 set容器中的数量。
            return res.size();
        }
    }
};

3.大神们的解决方案

**空间换取时间的方法:
应该很好理解,我就不多BB了。。。

class Solution {
public:
    int distributeCandies(vector<int>& candies) {
        int count = 0;
        int tmp[200001] = {0};
        for(int i = 0; i < candies.size(); ++i)
        {
            if(tmp[candies[i] + 100000] == 0)   //只统计 第一次 出现的糖果类型 数目
            {
                tmp[candies[i] + 100000] = 1;
                ++count;
            }
        }
        return min(count, (int)candies.size()/2);
    }
};

4.我的收获

又巩固了 空间换取时间的 方法。。。

4.1 set的用法

参考博文:Set的用法介绍
1.基本含义:set是STL中一种标准关联容器:它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。
2.set,顾名思义是“集合”的意思,在set中元素都是唯一的,而且默认情况下会对元素自动进行升序排列
3.set 支持集合的交(set_intersection),差(set_difference) 并(set_union),对称差(set_symmetric_difference) 等一些集合上的操作,如果需要集合中的元素允许重复那么可以使用multiset。

使用时注意包含头文件 std::set and std::multiset associative containers

s.begin()      返回set容器的第一个元素
s.end()    	返回set容器的最后一个元素
s.clear()       删除set容器中的所有的元素
s.empty()     判断set容器是否为空
s.insert()      插入一个元素
s.erase()       删除一个元素
s.size()     返回当前set容器中的元素个数

set容器的增删改查具体用法请参考上面的播客。

4.2 map容器和multimap容器

详细介绍请参考博文:C++ map容器和multimap容器

2019/4/7 胡云层 于南京 48

猜你喜欢

转载自blog.csdn.net/qq_40858438/article/details/89066426
今日推荐