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:

枚举所有可行的 X,判断是否有满足条件的 X 即可。

  1. X 必须是卡牌总数 N 的约数
  2. 遍历所有牌中存在的数字 i,看它们对应牌的数量是否是X的倍数

代码1:

from collections import Counter
class Solution(object):
    def hasGroupsSizeX(self, deck):

        N = len(deck)
        if N <= 1: return False
        number = Counter(deck).most_common()
        for X in range(2, N+1):
            if N % X == 0:
                if all(number[j][1] % X == 0 for j in range(len(number))):
                    return True
        return False

from collections import Counter

class Solution(object):
    def hasGroupsSizeX(self, deck):
        count = Counter(deck)
        N = len(deck)
        for X in range(2, N+1):
            if N % X == 0:
                if all(v % X == 0 for v in count.values()):
                    return True
        return False

解题思路2: 最大公约数

若X是所有牌出现次数的最大公约数,且 X>=2,则满足条件,否则,不满足。


代码2:

from fractions import gcd
from collections import Counter
from functools import reduce

class Solution(object):
    def hasGroupsSizeX(self, deck):
        vals = Counter(deck).values()
        return reduce(gcd, vals) >= 2

s = Solution()
deck = [0,0,0,1,1,1,2,2,2]
print(s.hasGroupsSizeX(deck))

参考链接:

[1]. Python之any()和all()用法
[2]. Python之Fraction和GCD求最大公约数
[3]. Python中的reduce()函数----可求积求和


题目来源:
https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值