天天看点

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