题目
Alice 有 n 枚糖,其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长,所以前去拜访了一位医生。
医生建议 Alice 要少摄入糖分,只吃掉她所有糖的 n / 2 即可(n 是一个偶数)。Alice 非常喜欢这些糖,她想要在遵循医生建议的情况下,尽可能吃到最多不同种类的糖。
给你一个长度为 n 的整数数组 candyType ,返回: Alice 在仅吃掉 n / 2 枚糖的情况下,可以吃到糖的最多种类数。
提示:
- n == candyType.length
- 2 <= n <= 10000
- n 是一个偶数
- -100000 <= candyType[i] <= 100000
一、解题思路
- 获得妹妹应得的糖果数量 sisterCandy。
- 获得糖果的种类数 category。
- 如果 category > sisterCandy,则说明妹妹最多能吃到 sisterCandy 种糖果且每种糖果恰好一颗,返回 sisterCandy;如果 category < sisterCandy,妹妹可以吃的糖果数量大于糖果种数,则说明妹妹最多能吃到 category 种糖果,且有些糖果不止吃到一颗,返回 category 即可。
综上可知,重点在于 “获得糖果种类数” 。
二、代码实现
1.用List集合
用 List 添加不重复的糖果种类,代码如下:
class Solution {
public int distributeCandies(int[] candyType) {
int len = candyType.length;
// 1. 获得妹妹应获得的糖果数
int sisterCandy = len/2;
// 2. 获得糖果种数
List<Integer> temp = new ArrayList<Integer>();
temp.add(candyType[0]);
for(int i=1;i<len;i++){
if(!temp.contains(candyType[i])) temp.add(candyType[i]);
}
int category = temp.size();
// 3. 比较大小
return category>sisterCandy?sisterCandy:category;
}
}
判断一个元素是否在集合内用到了contains方法,故时间消耗有点多,在LeetCode提交的时候显示“超出提交限制”,通过了171个用例。
之后经过分析,发现只要 category > sisterCandy ,结果就已经出来了,无需再比较。故在for循环中添加了一行代码:
if(temp.size()>=sisterCandy)break;
完整代码如下:
class Solution {
public int distributeCandies(int[] candyType) {
int len = candyType.length;
// 1. 获得妹妹应获得的糖果数
int sisterCandy = len/2;
// 2. 获得糖果种数
List<Integer> temp = new ArrayList<Integer>();
temp.add(candyType[0]);
for(int i=1;i<len;i++){
if(!temp.contains(candyType[i])) temp.add(candyType[i]);
if(temp.size()>=sisterCandy)break;
}
int category = temp.size();
// 3. 比较大小
return category>sisterCandy?sisterCandy:category;
}
}
提交之后,结果如下:
还是没有通过,但可以看到已经通过了202个测试用例,说明还是有一点用的。
2.用Set集合
先上代码:
class Solution33 {
public int distributeCandies(int[] candyType) {
int len = candyType.length;
// 1. 获得妹妹应获得的糖果数
int sisterCandy = len/2;
// 2. 获得糖果种数
Set<Integer> temp = new HashSet<Integer>();
temp.add(candyType[0]);
for(int i=1;i<len;i++){
// set不允许添加重复元素
temp.add(candyType[i]);
if(temp.size()>=sisterCandy)break;
}
int category = temp.size();
// 3. 比较大小
return category>sisterCandy?sisterCandy:category;
}
}
改动的不多,再看看提交结果:
通过了哦!这是因为Set不允许添加重复元素。
我们再来看看没有下面这行代码的提交结果:
if(temp.size()>=sisterCandy)break;
图在这:
效果变差了!
每日一更,敬请期待!