力扣刷题记录#数组#简单#914卡牌分组

题目描述

给定一副牌,每张牌上都写着一个整数。
选定一个数字 X,使整副牌可以按下述规则分成 1 组或更多组:
每组都有 X 张牌。
组内所有的牌上都写着相同的整数。
仅当X >= 2 时返回 true。

示例

输入:[1,2,3,4,4,3,2,1]
输出:true
解释:可行的分组是 [1,1],[2,2],[3,3],[4,4]

输入:[1,1,1,2,2,2,3,3]
输出:false
解释:没有满足要求的分组。

输入:[1]
输出:false
解释:没有满足要求的分组。

输入:[1,1]
输出:true
解释:可行的分组是 [1,1]

输入:[1,1,2,2,2,2]
输出:true
解释:可行的分组是 [1,1],[2,2],[2,2]

解答

统计各个数出现的次数,判断所有的出现次数是否有同样的公约数(大于2)
直接对所有数求公约数不好做,先对前两个数(第一第二个数)求最大公约数,再对第二第三个数求最大公约数,判断这两个公约数是否成比例,以此类推。

class Solution(object):
    def hasGroupsSizeX(self, deck):
        """
        :type deck: List[int]
        :rtype: bool
        """
        
        length = len(deck)
        
        if length<=1:
            return False
        
        # 统计各个数的出现次数
        deck_dict = dict()
        for num in deck:
            if num not in deck_dict.keys():
                deck_dict[num] = 0
            deck_dict[num] += 1
        
        counts = [v for v in deck_dict.values()]
        
        if len(counts)==1 and counts[0]>=2:
            return True
        
        # 判断各个数的出现次数有没有公约数
        
        # 前两个数的最大公约数
        if counts[0]<counts[1]:
            counts[0],counts[1] = counts[1],counts[0]
        while counts[0]%counts[1] != 0:
            counts[0],counts[1] = counts[1],counts[0]%counts[1]
        c = counts[1]
        
        # 最大公约数为1,不满足条件
        if c==1:
            return False

        # 这些的数的最大公约数是否成倍数
        for i in range(2,len(counts)):
            if counts[i-1]<counts[i]:
                counts[i-1],counts[i] = counts[i],counts[i-1]
            while counts[i-1]%counts[i] != 0:
                counts[i-1],counts[i] = counts[i],counts[i-1]%counts[i]
            cur_c = counts[i]
            
            # 最大公约数为1,不满足条件
            if cur_c == 1:
                return False
            
            # 判断当前最大公约数与第一个最大公约数是否成倍数
            # 若成倍数,则大者对小者取余时结果为0
            if cur_c>c:
                if cur_c%c != 0:
                    return False
            elif cur_c<c:
                if c%cur_c != 0:
                    return False
            
        return True

你可能感兴趣的:(力扣)