In a deck of cards, each card has an integer written on it.
Return true
if and only if you can choose X >= 2
such that it is possible to split the entire deck into 1 or more groups of cards, where:
- Each group has exactly
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
public boolean hasGroupsSizeX(int[] deck) {
if (deck.length <= 1) return false;
Hashtable<Integer, Integer> valueSizeTable = new Hashtable<>(deck.length);
for (int each : deck) {
Integer size = valueSizeTable.get(each);
if (size == null) size = 0;
valueSizeTable.put(each, ++size);
}
Collection<Integer> values = valueSizeTable.values();
int min = Integer.MAX_VALUE;
for (int each : values) {
if (each < min) min = each;
}
outer: for (int i = 2; i <= min; i++) {
boolean b1 = true;
for (int v : values) {
b1 &= v % i == 0;
if (!b1) continue outer;
}
if (b1) return true;
}
return false;
}