Программа курса:
Разбор задачи: Икс в колоде карт
Предложенный нами код решения:
def canPartition(deck):
"""
:type deck: List[int]
:rtype: bool
"""
# Подсчитываем частоты каждого числа
counts = {}
for card in deck:
counts[card] = counts.get(card, 0) + 1
# Вычисляем НОД (наибольший общий делитель) вручную для всех частот
frequencies = list(counts.values())
common_divisor = frequencies[0]
for freq in frequencies[1:]:
while freq:
common_divisor, freq = freq, common_divisor % freq
if common_divisor == 1: # Если НОД стал равен 1, дальнейшие вычисления не имеют смысла
return False
return common_divisor > 1- Цель задачи
Мы хотим определить, возможно ли разделить массив карт на группы, где:- Каждая группа содержит одинаковое количество карт (больше 1).
- Все карты в группе имеют одинаковое значение.
- Алгоритм работы функции
Подсчёт частот каждого числа
Для начала мы подсчитываем, сколько раз встречается каждая карта.
Это делается с помощью словаряcounts, где ключом является карта, а значением — её количество.
Например, для массиваdeck = [1, 2, 3, 4, 4, 3, 2, 1]получится:counts = {1: 2, 2: 2, 3: 2, 4: 2}Получение списка частот
Мы берём только значения из словаряcounts, чтобы работать с частотами.
Для примера выше это будет:frequencies = [2, 2, 2, 2]- Вычисление наибольшего общего делителя (НОД)
- НОД показывает, какое максимальное количество карт можно взять из каждой группы так, чтобы общее количество в каждой группе было одинаковым.
- Для этого используется алгоритм Евклида.
- Например, если частоты равны
[4, 6, 8], то НОД вычисляется как:- НОД(4, 6) = 2
- НОД(2, 8) = 2
Если в процессе вычислений НОД становится равным 1, то группировка невозможна, и функция сразу возвращаетFalse.
- Проверка НОД
Если итоговый НОД больше 1, это означает, что можно разделить карты на группы указанного размера, и функция возвращаетTrue.
- Примеры работы
- Пример 1
Входные данные:deck = [1, 2, 3, 4, 4, 3, 2, 1]
Частоты:{1: 2, 2: 2, 3: 2, 4: 2}
НОД:2
Вывод:True(группы[1, 1], [2, 2], [3, 3], [4, 4]). - Пример 2
Входные данные:deck = [1, 1, 1, 2, 2, 2, 3, 3]
Частоты:{1: 3, 2: 3, 3: 2}
НОД:1
Вывод:False(группировка невозможна). - Пример 3
Входные данные:deck = [3, 3, 3, 3, 3, 3]
Частоты:{3: 6}
НОД:6
Вывод:True(группы[3, 3, 3], [3, 3, 3]).
- Пример 1
- Особенности решения
- Подсчёт частот позволяет понять, сколько раз каждая карта встречается.
- НОД помогает найти минимальный размер группы, который подходит всем частотам.
- Алгоритм завершается досрочно, если становится ясно, что группировка невозможна (НОД равен 1).
Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии