题目描述
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。
测试用例
示例一:
输入: candies = [1,1,2,2,3,3]
输出: 3
示例二:
输入: candies = [1,1,2,3]
输出: 2
提示:
- 数组的长度为[2, 10,000],并且确定为偶数。
- 数组中数字的大小在范围[-100,000, 100,000]内。
解答
思路一:
首先因为是偶数个糖果,所以每人都能分到一半糖果,那问题关键在于糖果种类,如果糖果的种类m小于糖果数的一半n/2,则妹妹智能获得m种糖果,反之,妹妹可以获得n/2种糖果,所以妹妹可以获得的糖果种类就是m与n/2中的最小值。此处采用贪心。
class Solution {
public:
int distributeCandies(vector<int> &candyType) {
return min(unordered_set<int>(candyType.begin(), candyType.end()).size(), candyType.size() / 2);
}
};
复杂度分析
- 时间复杂度:O(n)O(n),其中 nn 是数组 \textit{candies}candies 的长度。
- 空间复杂度:O(n)O(n)。哈希表需要 O(n)O(n) 的空间。