leetcode 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 <= deck.length <= 10000
0 <= deck[i] < 10000
我的代码
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
int len = deck.size();
if ((len < 2) || ((len == 2) && (deck[0] != deck[1]))) {
return false;
}
vector<int> nums(10000, 0);
for (int num: deck) {
++nums[num];
}
int X = 1;
for (auto num: nums) {
if (num == 0) {
continue;
}
if (num == 1) {
return false;
}
if (X == 1) {
X = num;
continue;
}
X = __gcd(X, num);
if (X == 1) {
return false;
}
}
return true;
}
};
我的成绩
执行结果:通过
执行用时 : 60 ms, 在所有 C++ 提交中击败了5.34%的用户
内存消耗 : 20.2 MB, 在所有 C++ 提交中击败了5.71%的用户
一些想法
本道题我的想法是先用一个数组记录每个数字出现的次数,然后计算次数之间的公约数,如果公约数等于1则返回false。
执行用时为 4 ms 的范例
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
std::ios::sync_with_stdio(false);
if(deck.size()==1){
return false;
}
int arr[10001]={0};
for(int item : deck){
arr[item]++;
}
for (int i = 1; i < 10001; i++)
{
if(arr[i]!=arr[i-1]&&__gcd(arr[i-1],arr[i])==1){
return false;
}
}
return true;
}
};
思考
范例没太看懂是什么操作啊,如果出现次数分别是4,6,9的话好像会出错啊!!!