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: 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:

1 <= deck.length <= 10^4
0 <= deck[i] < 10^4

这题核心在于每张牌的数量,是否能找出一个公约数出来。这里就直接暴力算法了,一个一个尝试:

class Solution {
public:
    bool hasGroupsSizeX(vector<int>& deck) {
        unordered_map<int, int> groups;
        for (auto v : deck) {
            auto it = groups.find(v);
            if (it == groups.end()) {
                groups.insert(std::make_pair(v, 1));
            } else {
                it->second++;
            }
        }
        // Get the min cards in one group
        int mincount = 0;
        for (auto & v : groups) {
            if (v.second < 2) {
                return false;
            }
            if (0 == mincount) {
                mincount = v.second;
            } else {
                mincount = std::min(v.second, mincount);
            }
        }

        for (int i = 2; i <= mincount; i++) {
            bool subok = true;
            for (auto &v : groups) {
                if (v.second % i != 0) {
                    subok = false;
                    break;
                }
            }
            if (subok) {
                return true;
            }
        }

        return false;
    }
};
共 0 条回复
暂时没有人回复哦,赶紧抢沙发
发表新回复

作者

sryan
today is a good day