《LeetCode之每日一题》:196.分糖果
Posted 是七喜呀!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:196.分糖果相关的知识,希望对你有一定的参考价值。
题目链接: 分糖果
有关题目
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。
你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。
示例 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],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
注意:
数组的长度为[2, 10,000],并且确定为偶数。
数组中数字的大小在范围[-100,000, 100,000]内。
题解
法一:暴力
思路:
小女孩能得到的最大糖果的种类数为 n / 2,当糖果的种类数m 小于 n / 2时,则
小女孩能得到的最大糖果的种类数为 m。
故我们可以统计candyType中的种类数,candyType数组中重复出现的数字我们标记一下
最后结果在candyType.size() 与 cnt之间选择
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
int n = candyType.size();
int cnt = 0;
for (int i = 0;i < n && cnt < n / 2; i++)
{
if (candyType[i] != INT_MIN)
{
cnt++;
for (int j = i + 1; j < n; j++)
{
if (candyType[i] == candyType[j])
candyType[j] = INT_MIN;
}
}
}
return cnt;
}
};
法二:排序
参考官方题解
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
int n = candyType.size();
int cnt = 1;
sort(candyType.begin(), candyType.end());
for (int i = 1; i < n && cnt < n / 2; i++)
{
if (candyType[i] > candyType[i - 1])
cnt++;
}
return cnt;
}
};
法三:分类讨论 + 贪心
代码一:
参考官方题解
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
unordered_set<int> set(candyType.begin(), candyType.end());
return min(set.size(), candyType.size() / 2);
}
};
代码二:
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
unordered_set<int> set;
for (auto &x : candyType)
set.insert(x);
return min(set.size(), candyType.size() / 2);
}
};
代码三:
参考官方题解评论区下梦璃夜·天星
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
bitset<200001> s;//二进制的数组,可以直接用01串赋值
for (auto &x : candyType)
if (!s[x + 1e5])
s.set(x + 1e5);
return min(candyType.size() / 2, s.count());
}
};
时间复杂度:O(n),n为candyType的大小
空间复杂度:O©,C为二进制数组的大小
以上是关于《LeetCode之每日一题》:196.分糖果的主要内容,如果未能解决你的问题,请参考以下文章
解题报告Leecode. 575. 分糖果——Leecode每日一题系列