打卡第六天:分糖果


题目

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

一、解题思路

  1. 获得妹妹应得的糖果数量 sisterCandy
  2. 获得糖果的种类数 category
  3. 如果 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;

图在这:
图四
效果变差了!


每日一更,敬请期待!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值