publicbooleanhasGroupsSizeX(int[] deck){ //统计数字出现的个数 int[] counter = newint[10000]; for (int e : deck) { counter[e]++; } //找到数量最少的卡牌 int min = 10000; List<Integer> values=new ArrayList<>(); for (int e : counter) { if (e > 0) { values.add(e); min=Math.min(e,min); } } //如果最少的数量小于2,返回false if (min<2)returnfalse; //遍历[2,min]区间 for (int x=2;x<=min;x++){ //如果x不能整除length则跳过 if (deck.length%x!=0)continue; //检查x是否能整除每个数字的数量 if (isOK(values,x))returntrue; } returnfalse; }
privatebooleanisOK(List<Integer> values, int x){ for (int value : values) { //如果有不能被x整除的数量就返回false if (value%x!=0)returnfalse; } returntrue; }
publicbooleanhasGroupsSizeX(int[] deck){ //计数 int[] counter = newint[10000]; for (int e : deck) { counter[e]++; } //求GCD int x = 0; for (int value : counter) { if (value > 0) { if (x==0)x=value; else x=gcd(x,value); } } return x>=2; }
privateintgcd(int a, int b){ return a==0?b:gcd(b%a,a); }