X of a Kind in a Deck of Cards

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:

 

Example 1:

Input: deck = [1,2,3,4,4,3,2,1]
Output: true
Explanation: Possible partition [1,1],[2,2],[3,3],[4,4].

Example 2:

Input: deck = [1,1,1,2,2,2,3,3]
Output: false´
Explanation: No possible partition.

Example 3:

Input: deck = [1]
Output: false
Explanation: No possible partition.

Example 4:

Input: deck = [1,1]
Output: true
Explanation: Possible partition [1,1].

Example 5:

Input: deck = [1,1,2,2,2,2]
Output: true
Explanation: Possible partition [1,1],[2,2],[2,2].

 

Constraints:


Solution:

class Solution {
    public boolean hasGroupsSizeX(int[] deck) {
        if (deck.length <= 1) return false;
        Map<Integer, Integer> map = new HashMap();
        int min = deck.length;
        for (int val : deck) {
            map.put(val, map.getOrDefault(val, 0) + 1);
        }
        Integer gcd = null;
        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            int freq = entry.getValue();
            if (gcd != null) {
                gcd = gcd(freq, gcd);
                if (gcd == 1) return false;
            } else {
                gcd = freq;
            }
        }
        return true;
    }
    
    private int gcd(int x, int y) {
        if (y == 0) return x;
        return gcd(y, x % y);
    }
}