LeetCode575——分糖果

简介: LeetCode575——分糖果

   题目链接:. - 力扣(LeetCode)


 


       这道题比较简单,但我还是花费了将近四个小时的时间去解答,AC的那一刻,终于全身舒畅,这道题的思路就是先求出糖果的种数,然后我们从题中可以得出,Alice最少吃一种糖果,最多吃n/2种糖果,我们可以用二分法来写,下面来看代码:


//求出糖果种数,哈希的方式
int typecount(int* a, int size)
{
    //开辟空间注意数据范围,题上给的a[i]的数据范围是-100000到100000
    int* hx = calloc(200010,sizeof(int));//calloc开辟出来的空间初始都为0
    int count = 0;
    for (int i = 0; i < size; i++)
    {
        hx[a[i]+100000]++;//因为题上给的a[i]的数据范围是-100000到100000,所以
    }                     //hx[a[i]+100000]可以避免数组下标是负数
    for (int i = 0; i < 200010; i++)
    {
        if (hx[i] != 0)//ha[i]不为0,就说明是一种糖果类型,count++
        {
            count++;
        }
    }
    free(hx);//释放calloc开辟的空间
    return count;
}
 
int check(int mid,int count)
{
    if (mid < count)
        return 1;
    return 0;
}
 
int distributeCandies(int* candyType, int candyTypeSize) {
    int n = candyTypeSize;
    
    int count=typecount(candyType, candyTypeSize);//糖果种类
    //因为Alice最少吃一种糖果,最多吃n/2种糖果,所以用二分法
    int l = 1, r = n / 2;
    while (l < r)
    {
        int mid = (l + r) / 2;
        if (check(mid,count))
        {
            l = mid + 1;//如果mid<count,更新左边界,l=mid+1,因为mid肯定不是我们要找的值,
                        //所以我们在[mid+1,r]这个区间去找
        }
        else
            r = mid;//如果mid>=count,更新右边界,r=mid,因为mid可能等于count,也就是说
                    //mid可能是我们要找的值,所以我们在[l,mid]这个区间找
    }
    return r;//最后返回r就是Alice吃到糖的最多种类数,其实返回l也是可以的,因为到
            //最后l==r,返回哪个都是可以的
}


 代码注释的很清楚,这里就不再细说了,还需要注意的一点是count可能大于n/2,但是不影响,我们只需要在[1,n/2]这个区间找就好了。


  请注意 :轻易不要定义全局变量,很危险的,我就是因为把hx定义成全局变量,调试了很长时间,都过不去,就是找不到问题在哪,一定要记住这个坑呀!(当然,不亲身经历应该是记不住的,希望你们经历后,再来看这段话是什么感受)


第二种方法,看的题解


由题意可知

若糖的种类>(糖的总数)/2, 则吃的糖种类均不同, 返回candyTypeSize/2

若糖的种类<(糖的总数)/2, 则所有种类的糖均能吃到, 返回糖的种类数count

糖种类数的计算:


利用排序, 找不同下标的数组元素个数


代码:

int cmp(const void* a, const void* b) {

    return *(int*)a - *(int*)b;

}

 

int distributeCandies(int* candyType, int candyTypeSize){

    qsort(candyType, candyTypeSize, sizeof(int), cmp);

    int count = 1; //糖果的种类

    for (int i = 1; i < candyTypeSize; i++) {

        if (candyType[i - 1] != candyType[i]) {

            count++;

        }

    }

    return fmin(count, candyTypeSize / 2);

}


相关文章
|
12月前
【Leetcode -575.分糖果 -594.最长和谐子序列】
【Leetcode -575.分糖果 -594.最长和谐子序列】
51 0
|
4月前
|
算法 Java Go
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 1103 分糖果 II(Java/C/Python3实现含注释说明,Easy)
51 0
LeetCode 1103. 分糖果 II Distribute Candies to People
LeetCode 1103. 分糖果 II Distribute Candies to People
|
6天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
45 6
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
39 4
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
82 2
|
6天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
40 7