LeetCode914:

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

此时,你需要选定一个数字 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

解析:

   该题目需要计算出每个数字的数目,然后求数目的公约数,如果公约数不存在,则返回false,否则返回true。

该题目,做题时考虑成了用数目最小值作为公约数,因此出现错误。

代码:

bool hasGroupsSizeX(vector<int>& deck) 
{
	map<int, int>mapDeck;
	int size = deck.size();
	for (int i = 0; i < size; i++)//用map计算每个数字的数目
	{
		mapDeck[deck[i]]++;
	}
	int secondMinOfMapDeck = size;
	//找到数目的最小值
	for (map<int, int>::iterator iter = mapDeck.begin(); iter != mapDeck.end(); iter++)
	{
		if (iter->second < secondMinOfMapDeck)
			secondMinOfMapDeck = iter->second;
	}
	
	if (secondMinOfMapDeck < 2)
		return false;
	//找公约数
	for (int i = 2; i <= secondMinOfMapDeck; i++)
	{
		map<int, int>::iterator iter = mapDeck.begin();
		for (; iter != mapDeck.end(); iter++)
		{
			if (iter->second%i != 0)
				break;
		}
		if (iter == mapDeck.end())
		{
			secondMinOfMapDeck = i;
			break;
		}
	}
	//判断是否是公约数,不是则返回false
	for (map<int, int>::iterator iter = mapDeck.begin(); iter != mapDeck.end(); iter++)
	{
		if (iter->second%secondMinOfMapDeck != 0)
			return false;
	}
	return true;
}

猜你喜欢

转载自blog.csdn.net/qq_36214481/article/details/86567173
今日推荐