当前位置: 首页 > 后端技术 > Python

LeetCode卡片分组

时间:2023-03-26 00:16:44 Python

914。卡片分组题目来源:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards题目给定一副牌,每张牌上写着一个整数。此时,您需要选择一个数字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]Tip1<=deck.length<=100000<=deck[i]<10000解题思路:求最大公约数。复习题意,分析题意:相同整数的卡片放在同一组,每组的卡片为X张卡片。这里首先想到的是计算元素。对比例1和例2,统计元素个数。如果元素个数相等,则可以分组成功返回。True,否则返回False,这是一个思路。再看例子3,如果组中只有一个元素,直接返回False。再看例子5,其中1的个数为2个,2的个数为4个。这里将原组[2,2,2,2]分成两组[2,2],使得数元素的数量与前面的[1,1]相同。比如5,1有2,2有4,最后的组元素个数就是2。其实这里X=2,就是这两个组元素个数的公约数。根据以上分析结合题意和例子,确定如下思路:首先,遍历统计元素个数,如果只有一个元素,直接返回False;考虑例5的情况,将相同元素的分组进行拆分,达到题意分组的目的。这就涉及到公约数的思想。同时分组后组内元素个数严格大于1,那么可以考虑求最大公约数,同时保证最大公约数大于1。代码实现自敲入importListclass解决方案:defhasGroupsSizeX(self,deck:List[int])->bool:#用于统计来自集合的元素个数importCounterimportmathfromfunctoolsimportreduce#计算元素个数cnt_values=Counter(deck).values()#reduce()对参数序列中的元素进行累加#先对第1和第2个元素进行操作,用第3个元素计算结果,依此类推returnreduce(math.gcd,cnt_values)>1实现效果以上是通过统计元素个数求最大公约数,在最大公约数严格大于1的约束下,得到求解《卡牌分组》问题的主要内容.欢迎关注微信公众号《书所集录》