LeetCode题练习与总结:分糖果--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 <= 10^4
n
是一个偶数-10^5 <= candyType[i] <= 10^5
二、解题思路
- 首先,我们需要计算出所有不同种类的糖的数量。这可以通过使用一个集合(如HashSet)来实现,因为集合会自动去除重复的元素。
- 然后,我们需要比较这个不同种类糖的数量和 Alice 可以吃的糖的数量(即 n / 2)。
- Alice 可以吃到的最多不同种类的糖的数量将是这两个数中的较小者。
三、具体代码
import java.util.HashSet;
import java.util.Set;
class Solution {
public int distributeCandies(int[] candyType) {
// 使用 HashSet 存储不同种类的糖
Set<Integer> types = new HashSet<>();
for (int candy : candyType) {
types.add(candy);
}
// 计算可以吃到的最多不同种类的糖的数量
// 取集合大小(不同种类糖的数量)和 n / 2 中的较小值
return Math.min(types.size(), candyType.length / 2);
}
}
这段代码首先创建了一个 HashSet
来存储糖果的种类,然后遍历 candyType
数组,将每种糖果的类型添加到集合中。最后,使用 Math.min
方法来获取集合大小(即不同糖果种类的数量)和 n / 2
中的较小值,这就是 Alice 能够吃到的最多不同种类的糖果数量。
四、时间复杂度和空间复杂度
1. 时间复杂度
- 遍历
candyType
数组:这个操作的时间复杂度是 O(n),其中 n 是数组candyType
的长度。 - 将元素添加到
HashSet
中:对于每个元素,添加到集合的操作平均时间复杂度是 O(1)。在最坏的情况下(比如哈希冲突),添加操作的时间复杂度可能会退化,但平均而言,它仍然是 O(1)。
综上所述,总的时间复杂度是 O(n),因为这两个操作是顺序执行的。
2. 空间复杂度
HashSet
集合:在最坏的情况下,如果所有的糖果类型都是不同的,集合将包含 n 个元素。因此,空间复杂度是 O(n)。
综上所述,代码的空间复杂度是 O(n),这是由于需要存储不同糖果类型的集合。
五、总结知识点
-
类定义:
class
关键字用于定义一个类。- 类名
Solution
表示这是一个解决特定问题的类。
-
方法定义:
public
关键字表示方法可以被任何其他类访问。int
表示该方法返回一个整数值。- 方法名
distributeCandies
表示这个方法用于计算 Alice 可以吃到的最多不同种类的糖的数量。 - 参数
int[] candyType
表示方法接收一个整数数组作为参数。
-
数据结构:
HashSet
是 Java 中的一个集合实现,用于存储唯一元素,即不允许重复。Set
是一个接口,表示一个不包含重复元素的集合。
-
循环:
- 增强型
for
循环(for-each
循环)用于遍历数组candyType
。
- 增强型
-
集合操作:
add
方法用于将元素添加到HashSet
中。
-
数学计算:
Math.min
方法用于计算两个数中的较小值。
-
数组属性:
length
属性用于获取数组的长度。
-
类型转换:
- 使用了隐式类型转换,将
candyType.length
除以 2 的结果转换为int
类型,因为length
返回的是int
类型。
- 使用了隐式类型转换,将
-
方法返回值:
return
语句用于从方法中返回一个值。
以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。