题目翻译
给定一副牌,每张牌上都写着一个整数。
存在一个X,使得所有相同的数字可以分为X组。
题目分析
相同数字的数量问题
想到用map来存储一下每个数字的相同个数
所以①:遍历数组,创建map
每一个相同的数字都要分成X组,也就是map中每个数字的value值都要能整除X,也就是X是map中所有value值的公约数
所以②:遍历map,判断是否存在公约数X
(既然是存在,那只要最小公约数满足就可以了)
具体的判断方法就是:用一个变量来存储前两个key的value值的最小公约数,再和下一个key的value值求最小公约数,只要不是1就可以。
代码
class Solution {
public boolean hasGroupsSizeX(int[] deck) {
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i=0;i<deck.length;++i)
{
if(map.containsKey(deck[i]))
{
map.put(deck[i], map.get(deck[i])+1);
}
else
{
map.put(deck[i], 1);
}
}
int minvalue = map.get(deck[0]);
for(Integer key:map.keySet())//遍历map
{
int newnum = big(map.get(key),minvalue);
if(newnum == 1)
{
return false;
}
else
{
minvalue = newnum;
}
}
return true;
}
public int big(int a,int b)//求最小公约数
{
int min = a < b ? a : b;
for (int i = min;i >= 1;i --) {
if (a % i == 0 && b % i == 0) {
return i;
}
}
return 1;
}
}