Easy
题目描述
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] 类型,她仍然只能吃 2 种不同的类型。
示例 3:
输入:candyType = [6,6,6,6]
输出:1
解释:Alice 只能吃 4 / 2 = 2 颗糖果。即使她可以吃 2 颗糖果,她也只有 1 种类型。
约束条件:
- n == candyType.length
- 2 <= n <= 10⁴
- n 是偶数
- -10⁵ <= candyType[i] <= 10⁵
解题思路
这是一道比较简单的贪心问题。我们需要理解的关键点是:要使吃到的糖果类型数最多,就应该优先选择不同类型的糖果。
解题思路:
分析约束条件:Alice 最多只能吃 n/2 颗糖果,同时我们希望最大化糖果类型数量。
关键观察:
- 糖果的总类型数可能很多,也可能很少
- Alice 能吃的糖果数量是固定的:n/2
- 要最大化类型数,贪心策略是每种类型最多吃一颗
核心逻辑:
- 统计糖果的不同类型数量(使用哈希表去重)
- 答案是 min(不同类型数, n/2)
- 如果类型数 >= n/2,那么可以吃 n/2 种不同类型
- 如果类型数 < n/2,那么最多只能吃到所有类型数种
这个问题的本质是在有限的选择次数下,最大化选择的多样性。使用哈希表可以高效地统计不同类型的数量。
代码实现
class Solution {
public:
int distributeCandies(vector<int>& candyType) {
unordered_set<int> uniqueTypes;
for (int candy : candyType) {
uniqueTypes.insert(candy);
}
return min(uniqueTypes.size(), candyType.size() / 2);
}
};
class Solution:
def distributeCandies(self, candyType: List[int]) -> int:
unique_types = set(candyType)
return min(len(unique_types), len(candyType) // 2)
public class Solution {
public int DistributeCandies(int[] candyType) {
HashSet<int> uniqueTypes = new HashSet<int>(candyType);
return Math.Min(uniqueTypes.Count, candyType.Length / 2);
}
}
var distributeCandies = function(candyType) {
const uniqueTypes = new Set(candyType);
return Math.min(uniqueTypes.size, candyType.length / 2);
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 遍历数组一次,哈希表操作为 O(1) |
| 空间复杂度 | O(n) | 最坏情况下哈希表存储 n 个不同元素 |