题目:
In a deck of cards, each card has an integer written on it.
Return true if and only if you can chooseX
>= 2 such that it is possible to split the entire deck into 1 or more groups of cards, where:
Each group hasexactly X
cards. All the cards in each group have the same integer.
Example 1:Input: [1,2,3,4,4,3,2,1] Output: true Explanation: Possible partition [1,1],[2,2],[3,3],[4,4]
Example 2:
Input: [1,1,1,2,2,2,3,3] Output: false Explanation: No possible partition.
Example 3:
Input: [1] Output: false Explanation: No possible partition.
Example 4:
Input: [1,1] Output: true Explanation: Possible partition [1,1]
Example 5:
Input: [1,1,2,2,2,2] Output: true Explanation: Possible partition [1,1],[2,2],[2,2]
Note:
1 <= deck.length <= 10000
0 <= deck[i] < 10000
解释:
统计所有数字出现的次数,判断所有的次数的gcd结果是否>1,多个数字求gcd实际上就是两个数字求gcd以后的结果再对第三个数字求gcd,python中可以直接用reduce了,注意python3以后使用redece
需要from functools import reduce
。
python代码:
from collections import Counter
from functools import reduce
class Solution:
def hasGroupsSizeX(self, deck):
"""
:type deck: List[int]
:rtype: bool
"""
#判断是否所有个数的gcd>1,python中可以用reduce做,
#求多个数的gcd就是两个数求gcd的结果再和第三个数求gcd,也就是reduce了
def gcd(a,b):
while b:
a,b=b,a%b
return a
count=Counter(deck).values();
return reduce(gcd,count)>1
c++代码:
#include<map>
using namespace std;
class Solution {
public:
bool hasGroupsSizeX(vector<int>& deck) {
map<int ,int>count;
for (auto num:deck)
count[num]++;
int res=0;
for(auto item:count)
{
res=gcd(item.second,res);
}
return res>1;
}
int gcd(int a,int b)
{
while(b)
{
int tmp=a;
a=b;
b=tmp%b;
}
return a;
}
};
总结:
python 3.0以后, reduce已经不在built-in function里了, 要用它就得from functools import reduce
。
c++有一个编译器自己提供的求最大公约数的函数_gcd()
,至于编译器有没有提供就是另一说了,所以还是自己手动实现吧。
0和任何数的最大公约数还是任何数