【LeetCode】【Math】X of a Kind in a Deck of Cards
题目:
在一副纸牌中,每张纸牌上都有一个整数。
当且仅当您可以选择X> = 2并可以将整个卡片组分成1组或多组卡片时,才返回true,其中:
每个小组都有X张卡片。
每组中的所有卡均具有相同的整数。
Example 1:
Input: deck = [1,2,3,4,4,3,2,1] Output: true Explanation: Possible partition [1,1],[2,2],[3,3],[4,4].
Example 2:
Input: deck = [1,1,1,2,2,2,3,3] Output: false´ Explanation: No possible partition.
【解法】枚举法
我们将N张卡片分为K堆,每堆X张,所以必有N%X==0。
然后,N张卡片中每个数字有C_i张,分的每堆必有C_i%X==0。
class Solution: def hasGroupsSizeX(self, deck: List[int]) -> bool: count = collections.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
python3 中取消了 range 函数,而把 xrange 函数重命名为 range,所以现在直接用 range 函数即可。
range 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个列表。
xrange函数说明:和range 的用法完全相同,但是返回的是一个生成器。
但是要生成很大的数字序列的时候,用xrange会比range性能优很多,因为不需要一上来就开辟一块很大的内存空间,这两个基本上都是在循环的时候用。除非你需要一个列表,不然xrange可以提高性能。(但我在提交的时候,用xrange会报错,(⊙o⊙)…
all() 函数用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。
元素除了是 0、空、None、False 外都算 True。
语法:all(iterable)
iterable为元组或列表
返回值:如果iterable的所有元素不为0、''、False或者iterable为空,all(iterable)返回True,否则返回False;
注意:空元组、空列表返回值为True,这里要特别注意。
python3的Collections.Counter计数(类似于Java中的map)
class Solution: def hasGroupsSizeX(self, deck: List[int]) -> bool: from fractions import gcd
from functools import reduce
from math import gcd
vals = collections.Counter(deck).values() return reduce(gcd, vals) >= 2
Runtime: 236 ms, faster than 10.94% of Python3 online submissions for X of a Kind in a Deck of Cards.
class Solution: def hasGroupsSizeX(self, deck: List[int]) -> bool: def gcd(a, b): while b: a, b = b, a % b return a count = collections.Counter(deck).values() return reduce(gcd, count) > 1
reduce() 函数会对参数序列中元素进行累积。
函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。
reduce() 函数语法:
reduce(function, iterable[, initializer])
- function -- 函数,有两个参数
- iterable -- 可迭代对象
- initializer -- 可选,初始参数
返回函数计算结果。
在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 functools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数:
from functools import reduce
参考:https://blog.csdn.net/qq_39445165/java/article/details/107089834

浙公网安备 33010602011771号