169、卡牌分組
阿新 • • 發佈:2019-01-08
題目描述
給定一副牌,每張牌上都寫著一個整數。
此時,你需要選定一個數字 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
題目很簡單,就是求出現的次數中的最小公因數
從2開始
class Solution { public boolean hasGroupsSizeX(int[] deck) { int result [] = new int[10001]; for (int i : deck) { result[i] ++; } int min = Integer.MAX_VALUE; for (int i : result) { if(i != 0){ if(min > i){ min = i; } } } if(min < 2){ return false; } //從2開始 int tem = 2; while (tem<=min) { boolean flag = false; for (int i : result) { if(i != 0){ if(i % tem != 0){ tem++; flag = true; break; } } } if(! flag){ return true; } } return false; } }
排名靠前的程式碼
class Solution { public boolean hasGroupsSizeX(int[] deck) { if(deck.length<2) return false; Arrays.sort(deck); ArrayList<Integer> temp = new ArrayList<>(); int sum = 1; for(int i=0;i<deck.length-1;i++){ if(deck[i]==deck[i+1]) sum++; else{ temp.add(sum); sum=1; } } temp.add(sum); search: for(int X=2;X<=deck.length;X++){ if(deck.length%X==0){ for(int v : temp){ if(v==1) return false; if(v%X!=0) continue search; } return true; } } return false; } }