題目
給定一副牌,每張牌上都寫著一個(gè)整數(shù)。
此時(shí),你需要選定一個(gè)數(shù)字 X,使我們可以將整副牌按下述規(guī)則分成 1 組或更多組:
每組都有 X 張牌。
組內(nèi)所有的牌上都寫著相同的整數(shù)。
僅當(dāng)你可選的 X >= 2 時(shí)返回 true。
示例:
輸入:[1,2,3,4,4,3,2,1]
輸出:true
解釋:可行的分組是 [1,1],[2,2],[3,3],[4,4]
輸入:[1,1,1,2,2,2,3,3]
輸出:false
解釋:沒有滿足要求的分組。
輸入:[1,1]
輸出:true
解釋:可行的分組是 [1,1]
條件:
- 1 <= deck.length <= 10000
- 0 <= deck[i] < 10000
解答
public static boolean hasGroupsSizeX(int[] deck) {
int[] ints = new int[10000];
for (int val : deck) {
ints[val]++;
}
int g = 0;
for (int val : ints) {
if (val > 0) {
if (g == 0) {
g = val;
} else {
g = gcd(g, val);
}
}
}
return g >= 2;
}
// 求兩個(gè)數(shù)最大公約數(shù)的方法
public static int gcd(int x, int y) {
return y == 0 ? x : gcd(y, x % y);
}
// 測(cè)試方法:
public static void main(String[] args) {
int gcd = gcd(8, 12);
System.out.println(gcd);
int[] deck = {1, 1};
boolean b = hasGroupsSizeX(deck);
System.out.println(b);
}
分析
第一步
將每個(gè)元素出現(xiàn)的次數(shù)做統(tǒng)計(jì),元素的值是新數(shù)組的下標(biāo),次數(shù)是新數(shù)組的value;
然后依次計(jì)算最大公約數(shù),最后判斷最大公約數(shù)是否大于等于2。