题目描述
题目链接:575.分糖果
Alice有n
枚糖,其中第i
枚糖的类型为candyType[i]
。Alice注意到她的体重正在增长,所以前去拜访了一位医生。
医生建议 Alice 要少摄入糖分,只吃掉她所有糖的n / 2
即可(n
是一个偶数)。Alice非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。
给你一个长度为n
的整数数组candyType
,返回: Alice在仅吃掉n / 2
枚糖的情况下,可以吃到糖的最多
种类数。
示例 1
输入:candyType = [1,1,2,2,3,3]
输出:3
解释:Alice 只能吃 6 / 2 = 3 枚糖,由于只有 3 种糖,她可以每种吃一枚。
示例 2
输入:candyType = [1,1,2,3]
输出:2
解释:Alice 只能吃 4 / 2 = 2 枚糖,不管她选择吃的种类是 [1,2]、[1,3] 还是 [2,3],她只能吃到两种不同类的糖。
示例 3
输入:candyType = [6,6,6,6]
输出:1
解释:Alice 只能吃 4 / 2 = 2 枚糖,尽管她能吃 2 枚,但只能吃到 1 种糖。
提示
n
==candyType.length
- 2 <=
n
<= 104 n
是一个偶数- -105 <=
candyType[i]
<= 105
解题核心
本题最主要的就是获取糖果种类的数量,也就是去重,因为我们选择的数量是一定的,也不需要我们返回每种选择的方案,就不需要考虑这么多
解法一:贪心算法
利用set集合
快速去重然后比大小即可
public int distributeCandies(int[] candyType) {
HashSet<Integer> set = new HashSet<>();
for (int i : candyType) {
set.add(i);//本题关键就是去重
}
return Math.min(candyType.length / 2, set.size());
}
用数组也可去重,就是O(n²)
不支持大量的数据
public int distributeCandies(int[] candyType) {
int count = 0;
for (int i = 0; i < candyType.length; i++) {
boolean isEqual = false;
for (int j = i + 1; j < candyType.length; j++) {
if (candyType[j] == candyType[i]) {
isEqual = true;
break;
}
}
if (!isEqual) {
count++;
}
}
return Math.min(candyType.length / 2, count);
}