1. 程式人生 > >Leetcode_Array --914. X of a Kind in a Deck of Cards [easy]

Leetcode_Array --914. X of a Kind in a Deck of Cards [easy]

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.

如果你能且僅能找到一個 X>= 2,使這些牌分成一組或多組牌,這些牌滿足如下規則: 每組牌都恰好含有X張卡片 每組卡片中的數都相同 那麼返回 true

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、1 <= deck.length <= 10000 2、0 <= deck[i] < 10000

Solution: 這個演算法是要統計deck中所有元素出現的個數,元素出現個數最小的個數為整個元素出現個數的最大公約數,也就是說分成的組的元素個數最小從2開始,最大就到這個最大公約數。這樣我們就需要先統計元素出現個數,在找到deck中所有元素出現個數的最大公約數,然後遍歷從2到這個最大公約數,如果元素出現的個數對這個區間的某個數求餘都為0,表示可以按照這個數進行分組,則返回true,否則返回false。

Python

from collections import Counter
class Solution:
    def hasGroupsSizeX(self, deck):
        """
        :type deck: List[int]
        :rtype: bool
        """
        count = set(list(Counter(deck).values()))   #統計deck元素出現個數
        min_num = min(count)   #每組的牌的個數最大應該到count中最小的那個數,所以遍歷從2到min_num,其實這個區間就是牌組中元素個數的公約數,查詢哪一個公約數合適
        for i in range(2,min_num+1):
            if all([ x%i == 0 for x in count]):   #all函式中是一個迭代型別,判斷迭代的元素是否為真。在這裡表示這個公約數是否能夠使所有個數都對其求餘為0,滿足的話就返回True
                return True
        return False
C++

class Solution {
public:
    bool hasGroupsSizeX(vector<int>& deck) {
        unordered_map<int,int> Map;
        for (auto i : deck){
            Map[i]++;   #首先記錄deck中元素出現的個數
        }
        int min_num = deck.size();
        for (auto c:Map){
            if (c.second < min_num){
                min_num = c.second;  #找到元素出現個數的最小值
            }
        for (int i =2;i<=min_num;i++){   #遍歷從2到這個最小值
            int j = 0;
            for (auto c:Map){   #如果Map中元素出現的個數對i求餘為0則j++,當j的個數和Map中元素個數相等的時候,表明i是Map中每個元素出現的公約數,那麼直接返回ture
                if (c.second%i == 0){
                    j++;
                    
                }
            if (j == Map.size()){
                return true;
            }
            }
        }
        return false;   #如果遍歷了2到元素出現的最小個數之間所有值,j都不等於deck.size(),表明沒有公約數,則返回false
        }
    }
};