【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
Runtime: 236 ms, faster than 10.94% of Python3 online submissions for X of a Kind in a Deck of Cards.
Memory Usage: 14 MB, less than 68.07% of Python3 online submissions for X of a Kind in a Deck of Cards.

 

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)

在平常刷题的过程中,经常会遇到需要对字符串的字母或者是列表中的数字进行计数,对于Java语言来说可以使用map对其进行计数,在python中可以使用Collections.Counter方法进行计数,最常见的是可以对列表中的元素进行计数,并且计数之后是以字典的形式返回结果的,这样的话对于后面的操作就很方便了,官方提供的api解释如下:
https://docs.python.org/zh-cn/3.8/library/collections.html#collections.Counter
Counter方法可以接收列表、元祖、字符串为参数对参数中的元素进行计数,比较常见的是对列表中的元素进行计数,计数完了之后可以访问键可以得到具体的值
 
【解法】
每个数字i有C_i张卡,被分为X堆,则所有i,都满足C_i%X == 0
因此,如果C_i的最大公约数 g>1,则令X==g满足题目条件,反之不满足。
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.

Memory Usage: 14.2 MB, less than 5.01% 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
Runtime: 296 ms, faster than 5.64% of Python3 online submissions for X of a Kind in a Deck of Cards.
Memory Usage: 13.8 MB, less than 97.81% of Python3 online submissions for X of a Kind in a Deck of Cards.
 
gcd()函数:最大公约数求解

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
posted @ 2020-07-12 21:10  桃花换小鱼干好不好  阅读(178)  评论(0)    收藏  举报