575.分糖果
题目
原题链接:https://leetcode-cn.com/problems/distribute-candies/
给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。
示例:
输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。
输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
解题思路
关键是获得糖果种类的数量:
-
如果
糖果种类
大于糖果总数的一半
(糖果需要平均分),返回糖果数量的一半
,因为妹妹已经得到种类最多的糖果(得到的都是不同种类的糖果); -
如果
糖果种类
小于糖果总数的一半
,则返回糖果的种类
(依然是均分的,但妹妹获得的糖果有重复种类)。
代码实现
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
/**
* 575.分糖果
* @date 2021/5/16
* @author chenzufeng
*/
public class No575_DistributeCandies {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String[] strings = reader.readLine().split(" ");
int[] candies = new int[strings.length];
for (int i = 0; i < strings.length; i++) {
candies[i] = Integer.parseInt(strings[i]);
}
System.out.println(distributeCandies(candies));
}
static public int distributeCandies(int[] candyType) {
// HashSet可以去除重复的元素,获得糖果的种类
HashSet<Integer> hashSet = new HashSet<>();
for (int candy : candyType) {
hashSet.add(candy);
}
// 如果糖果种类大于糖果数量的一半,则“妹妹获得的最大糖果种类”为糖果数量的一半
return Math.min(hashSet.size(), candyType.length / 2);
}
}
复杂度分析
时间复杂度:\(O(n)\)。整个\(candies\)数组只遍历一次。这里,\(n\)表示\(candies\)数组的大小。
空间复杂度:\(O(n)\),在最坏的情况下,\(set\)的大小为\(n\)。