天天看點

914. 卡牌分組

給定一副牌,每張牌上都寫着一個整數。

此時,你需要標明一個數字 

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. 1 <= deck.length <= 10000

  2. 0 <= deck[i] < 10000

class Solution:
    def hasGroupsSizeX(self, deck: 'List[int]') -> 'bool':
        deck = sorted(deck)
        num = {}
        x, count = 1, 1
        # 統計每個元素的個數,放在字典中
        for i in range(0, len(deck)-1):
            if deck[i] == deck[i+1]:
                count += 1
            else:
                num[deck[i]] = count
                count = 1
        num[deck[-1]] = count
        # 找出個數最小的X,并判斷是否>=2
        x = min(num.values())
        if x < 2:
            return False
        # 判斷每個元素的個數是否都能被 2到x之間 的數整除,即是否可以分組
        for i in range(2, x + 1):
            for cot in num.values():
                if cot % i != 0:
                    break
            else:
                return True
        return False
    def hasGroupsSizeX2(self, deck: 'List[int]') -> 'bool':
        d = set(deck)
        dic = {}
        # 統計每個元素的個數(内置函數),放在字典中
        for i in d:
            dic[i] = deck.count(i)
        # 找出個數最小的X
        mn = min(dic.values())
        for i in range(2, mn + 1):
            for j in dic.values():
                if j % i != 0:
                    break
            else:
                return True
        return False

if __name__=='__main__':
    s = Solution()
    A = [1,1,1,1,2,2,2,2,2,2]
    print(s.hasGroupsSizeX(A))