914卡牌分组解法二

本来有想到用找公约数的方法来替代循环求余找到分组的数量,现在仔细一想,其实完全可以直接用求公约数的方法找到正确答案。

解析:
举例数组:[1,1,1,1,2,2,3,3,3,3],1的数量是4,3的数量是4,2的数量是2。划分为四人一组2就不满足要求,但通过求4与2的公约数,可以得出2,划分为两人一组即可满足条件。故可以用计数的方法牺牲空间来提高执行时间。

缺点:
计数的方法在数据间隔很大的时候需要浪费很多空间,如[1,1,10000,10000],如果使用count计数,中间9998位是被浪费掉的。当然效率也会比较高。

排除掉的做法:


image.png

本来打算给计数排个序,然后从有数据的位置数起来,遇见0就停止循环,减少运行次数,没想到提交后发现排序后花的时间更多了。


image.png

不排序的结果如下:
image.png

内存消耗和第一个版本差不多,但是速度是两倍。


image.png

理论上第二个解法应该会消耗更多的内存,可能是因为测试数据间隔不大的缘故,所以计数的缺点没有体现出来。

代码如下:

int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}


bool hasGroupsSizeX(vector<int>& deck)
{
    int people_number=0;

    int count[10000] = {0};
    int n = deck.size();
    if (n == 1) return false;
    for (int i = 0;i < n;i++) 
        count[deck[i]]++;
    
    for (int i = 0;i < n;i++)
    {
        if (count[i] > 0) 
        {         
            people_number = gcd(people_number, count[i]);
            if (people_number == 1)
                return false;
        }
    }
    return true;      
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一章数和数的运算 一概念 (一)整数 1整数的意义 自然数和0都是整数。 2自然数 我们在数物体的时候,用来表示...
    meychang阅读 2,661评论 0 5
  • 小学奥数的知识点约 80个,总体上可以分为五大类。数论和行程问题是小 学奥数学习中的重点也是难点。 一、 计算能力...
    ADolphin阅读 8,205评论 1 3
  • 小升初的过程中,竞赛成绩能起到相当大的作用,谈到竞赛就离不开奥数。以下是小学奥数题知识点大汇总: 1.和差倍问题 ...
    沪江中小幼阅读 1,148评论 0 7
  • 小学奥数其实很简单,以下是这六个部分的知识点! 1 第一部分(知识点1-6) 2、年龄问题的三个基本特征: ①两个...
    小一哥阅读 1,369评论 0 3
  • 回答微博问题:雨水碰上元宵节该如何养生 今年的雨水节气刚好就是元宵节,养生的要点是3个:排湿气,保暖,多运动 雨水...
    舒熠烯阅读 200评论 0 2