914. O pacote de cartão
ligações Tópico: https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
Dificuldade: Fácil
Assunto Descrição:
Dado um baralho de cartas, cada cartão são escritos em um inteiro.
Neste ponto, você precisa selecionar um número X
, para que possamos ser baralhos completos de acordo com as seguintes regras em 1 组
ou 更多组
:
- Cada grupo tem um
X
cartão. - Dentro do grupo são escritos da mesma inteiro em todos os cartões.
Somente quando você opcionais X >= 2
retornos true
.
Exemplos
Exemplo 1:
Entrada: [1,2,3,4,4,3,2,1]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1], [2,2], [3,3], [ 4,4]
Exemplo 2:
Entrada: [1,1,1,2,2,2,3,3]
Saída: falso
interpretação: o pacote não satisfaz as exigências.
Exemplo 3:
Entrada: [1]
Saída: falso
interpretação: o pacote não satisfaz as exigências.
Exemplo 4:
Entrada: [1,1]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1]
Exemplo 5:
Entrada: [1,1,2,2,2,2]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1], [2,2], [2,2]
pronto:
1 <= deck.length <= 10000
0 <= convés [i] <10000
idéias de solução de problemas
Esta questão eu acho que por um longo Leng Shimo feita, ou perguntas estrada simples, auto-confiança está rolando, e realmente não esperava usar 最大公约数
para fazer, hey, hum
Esta questão é crucial é que podemos pensar em usar 最大公约数
para calcular.
-
1, os primeiros dados estatísticos sobre o número de cada elemento, que consiste de uma lista
- maneira simples:
num = list(collections.Counter(deck).values())
um passo
- maneira simples:
-
2, Passo 1 lista calculado maior divisor comum obtido
- maneira simples:
n = reduce(math.gcd, num)
um passo
- maneira simples:
-
3, se o divisor ou igual a 2, True é retornado, caso contrário devolve Falso
Em que o pedido n
número 最大公约数
, ou 最小公倍数
se você quiser realizado manualmente, calculada da seguinte forma:
- 1> primeiro encontrar o máximo divisor comum e mínimo múltiplo comum do número 2
- 2> e os resultados do terceiro número e o mínimo múltiplo comum e o máximo divisor comum continuou
- 3> A mesma demanda tem sido, até que todos os números estão buscando novamente
O código de exemplo
# 简单方法
import collections
import math
from functools import reduce
class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
num = list(collections.Counter(deck).values())
n = reduce(math.gcd,num)
return False if n<2 else True
#该简单方法参考自:
##作者:jutraman
##链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/pythonqia-pai-fen-zu-by-jutraman/
# 复杂一点的,其实就是把上述简单方法调的函数自己手动实现而已
class Solution:
def hasGroupsSizeX(self, deck: List[int]) -> bool:
# 第1步:统计,结果保存在num列表中
# 简单方法:num = list(collections.Counter(deck).values())
only_ele = [deck[0]]
num = {deck[0]: 1}
for i in deck[1:]:
if i in only_ele:
n = num[i] + 1
num[i] = n
else:
num[i] = 1
only_ele.append(i)
num = list(num.values())
if len(num)==1:
if num[0] > 1:
return True
return False
# 第2步:计算最大公约数n
# 简单方法:n = reduce(math.gcd, num)
n = self.gcd(num[0],num[1])
for i in range(len(num)-2):
n = gcd(n,num[i+2])
# 第3步:判断最大公约数是否大于等于2
return True if n>1 else False
def gcd(self,a,b):# 计算两个数的最大公约数
if a < b:#让a保持是大的数
temp = b
b = a
a = temp
n = 1
i = 1
while i <= b:
if a % i == 0 and b % i == 0:
n = i
i += 1
return n