分糖果问题你学会了吗?

274 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

问题描述

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

示例:

输入: candies = [2,2,3,3,4,4]

输出: 3

解析: 数组中有三种不同的数字2、3、4,代表了三种不同种类的糖果,每一种都有两个。在这种情况下,最优的分配方案是,妹妹获得[2,3,4],弟弟也获得[2,3,4]。这样使得妹妹获得的糖果种类数最多。

分析问题

根据题目要求,需要平均分配糖果给弟弟和妹妹,所以妹妹能分配到的糖果数量为n/2。最好的情况是妹妹得到的n/2个糖果是属于不同种类的,也就是说妹妹可以得到的最大的糖果种类数是n/2。此外,如果数组中糖果的种类数小于n/2时,为了使妹妹得到的糖果种类数达到最大,我们会将数组中不同种类的糖果分配给妹妹。因此,在这种情况下,妹妹能获得的不同种类的糖果数量等于给定数组中糖果的种类数。

现在我们就把问题转化成如何求出数组中糖果的种类数,假设为count。那么分配给妹妹的最大糖果种类数就是min(n/2,count)。下面我们来看一下如何求出数组中糖果的种类数,最直观的想法就是遍历给定的数组,然后将元素放入一个集合Set中,利用集合Set能去重的特性,来求出数组的糖果的种类的个数。

def distributeCandies(candies):
    candies_set=set()
    #遍历数组
    for canday in candies:
        #为了获得不同种类的糖果数
        candies_set.add(canday)
        
    return min(len(candies)/2, len(candies_set))

candies = [1,1,2,2,3,3]
print(distributeCandies(candies))