Leetcode—— 575. 分糖果

575. 分糖果

给定一个偶数长度的数组,其中不同的数字代表着不同种类的糖果,每一个数字代表一个糖果。你需要把这些糖果平均分给一个弟弟和一个妹妹。返回妹妹可以获得的最大糖果的种类数。

示例 1:

输入: candies = [1,1,2,2,3,3]
输出: 3
解析: 一共有三种种类的糖果,每一种都有两个。
最优分配方案:妹妹获得[1,2,3],弟弟也获得[1,2,3]。这样使妹妹获得糖果的种类数最多。
示例 2 :

输入: candies = [1,1,2,3]
输出: 2
解析: 妹妹获得糖果[2,3],弟弟获得糖果[1,1],妹妹有两种不同的糖果,弟弟只有一种。这样使得妹妹可以获得的糖果种类数最多。
注意:

数组的长度为[2, 10,000],并且确定为偶数。
数组中数字的大小在范围[-100,000, 100,000]内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distribute-candies
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

本题思路很简单,只需要判断糖果的种类是否大于糖果数量的一半,如果大于糖果数量的一半,则妹妹能分到的糖果种类为糖果数量的一半,如果糖果种类小于等于糖果数量的一半,则妹妹能分到的糖果种类即为糖果的种类。

可以先排序,然后来判断相邻数字是不是相等来记录新种类糖果的个数。

程序代码1(Python):

class Solution:
    def distributeCandies(self, candies):
        n = len(candies)
        m = n // 2
        candies.sort()
        count = 1
        for i in range(1,n):
            if candies[i] != candies[i-1]:
                count += 1
        if count > m:
            return m
        else:
            return count

程序代码1(C++):

class Solution 
{
public:
    int distributeCandies(vector<int>& candies) 
	{
		sort(candies.begin(), candies.end());
		int count = 1;
		int n = candies.size();
		for (int i=1;i<n;i++)
		{
			if (candies[i]!=candies[i-1])
				count++;
		}
		if (count > n/2)
			return n/2;
		else
			return count;
    }
};

解题思路2:

利用集合来做。

程序代码2(Python):

class Solution:
    def distributeCandies(self, candies: List[int]) -> int:
        return min(len(set(candies)),len(candies)//2)

程序代码2(C++):

class Solution 
{
public:
    int distributeCandies(vector<int>& candies) 
	{
        set<int> res;
        for(int i=0;i<candies.size();i++)
		{
            res.insert(candies[i]);
            if(res.size() >= candies.size()/2)
				return candies.size()/2;
        }
        return res.size();
    }
};

你可能感兴趣的:(C++,Python,LeetCode)