Leetcode 914. 卡牌分组 c语言

Leetcode 914. 卡牌分组 c语言

问题描述

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

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

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

示例一

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

示例二

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

示例三

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

示例四

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

示例五

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

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

来源:力扣(LeetCode)

简要分析

我们可以构建一个 “数字表” 统计牌上数字出现的个数,然后通过比较它们是否存在大于一的公约数,来判断能否进行分组。

代码如下

//数组count用来统计牌上数字出现个数
//min为出现次数最少的数字出现的次数
bool hasGroupsSizeX(int* deck, int deckSize)
{
    int count[10000] = { 0 };
    int i = 0, min = 10000;
    
    if(deckSize == 1)
    {
        return false;
    }
    for(i = 0 ; i < deckSize; i++)
    {
        count[deck[i]]++;
    }
    for(i = 0; i < 10000; i++)
    {
        if(count[i] == 0)
        {
            continue;
        }
        else if(count[i] < min)
        {
            min = count[i];
        }
    }
//下面来判断这些出现的次数有没有大于一的公约数
    for(int j = 2; j < min + 1; j++)
    {
        for(i = 0; i < 10000; i++)
        {
            if(count[i] == 0)
            {
                continue;
            }
            else
            {
                if(count[i] % j == 0)
                {
                    continue;
                }
                else
                {
                    break;
                }
            }
        }
        if(i == 10000)
        {
            return true;
        }
    }

    return false;
 }

在这里插入图片描述
在这里插入图片描述

发布了4 篇原创文章 · 获赞 0 · 访问量 56

猜你喜欢

转载自blog.csdn.net/ninotxdy/article/details/105150725