Leetcode 914.卡牌分组【C++】
本文最后更新于:2022年3月23日 晚上
地址:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
题目
给定一副牌,每张牌上都写着一个整数。
此时,你需要选定一个数字 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 <= deck.length <= 10000
0 <= deck[i] < 10000
解题思路
思路还是很容易想到的,统计不同数字的个数,然后求所有不同数字的个数的最大公约数,也就是最终能分成的组中的数的个数。
如果数组中元素的个数不到2个,是肯定找不到符合要求的分组的,所以直接返回 false
即可。
我用了一个 vector<pair<int, int>>
的数组 cards
来统计不同数字的个数,cards[i].first
即数组中的某一个数字,cards[i].second
即这个数字在数组中的个数。然后遍历 cards
求所有的 cards[i].second
的最大公约数,返回值判断其是否大于或等于 2
即可。
代码
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
if (deck.size() < 2)
return false;
//统计不同数字的个数
vector<pair<int, int>> cards;
for (auto d : deck) {
bool exist = false;
for (int i = 0; i < cards.size(); i++) {
if (d == cards[i].first) {
cards[i].second++;
exist = true;
break;
}
}
if (exist == false) {
cards.push_back({ d,1 });
}
}
int agcd = cards[0].second;//最大公约数,即最终每个组的数的个数
for (int i = 0; i < cards.size(); i++) {
agcd = gcd(agcd, cards[i].second);
}
return agcd >= 2;
}
//返回两个数的最大公约数
int gcd(int m, int n) {
int t = 1;
while (t != 0) {
t = m % n;
m = n;
n = t;
}
return m;
}
};
Leetcode 914.卡牌分组【C++】
https://mxy493.xyz/2020032742159/