LeetCode 914. 卡牌分组

914. 卡牌分组

难度简单

给定一副牌,每张牌上都写着一个整数。

此时,你需要选定一个数字 X,使我们可以将整副牌按下述规则分成 1 组或更多组:

  • 每组都有 X 张牌。
  • 组内所有的牌上都写着相同的整数。

仅当你可选的 X >= 2 时返回 true

示例 1:

输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

示例 2:

输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。

示例 3:

输入:[1]
输出:false
解释:没有满足要求的分组。

示例 4:

输入:[1,1]
输出:true
解释:可行的分组是 [1,1]

示例 5:

输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]


提示:

  1. 1 <= deck.length <= 10000
  2. 0 <= deck[i] < 10000

 思路:这道题可以先将提供的所有相同数据用数组存储起来,然后找出这些数据个数的最大公约数用另一个数组储存起来,在这个数组中,找出最小的数字,用所有数据个数依次除以这个最小的最大公约数,如果余数不为0,证明不成立,返回false,否则,返回true,然后重点来了,一定要记得考虑好边界值,鄙人因为这个问题找了一个小时还有多的bug,费话不多说,咱来看看代码。

bool hasGroupsSizeX(int* deck, int deckSize){
    if(deckSize<2){
        return false;
    }
    int a[10000],b[deckSize-1];
    int i,m,n,c,min,flag=1;
    for(i=0;i<10000;i++){
        a[i]=0;
    }
    for(i=0;i<deckSize;i++){
        a[deck[i]]++;
    }
    for(i=0;i<deckSize-1;i++){
        n=1;
        m=a[deck[i]];
        c=a[deck[i+1]];
        while(n!=0){
            n=m%c;
            m=c;
            c=n;
        }
        b[i]=m;
    }
    min=b[0];
    for(i=0;i<deckSize-1;i++){
        min=min>b[i]?b[i]:min;
    }
    for(i=0;i<deckSize;i++){
        if(a[deck[i]] % min != 0){
            flag=0;
        }
    }
    for(i=0;i<deckSize-1;i++){
        if(b[i]==1){
            return false;
        }
    }
    if(flag==0){
        return false;
    }
    return true;

}
原文地址:https://www.cnblogs.com/woju/p/12584697.html