Жадно берите 2, 4, 6 и далее, пока остатка хватает на следующее число. Ненулевой остаток прибавьте к последней части; количество частей останется максимальным.
Разложение числа на максимум различных чётных частей
Жадно берите 2, 4, 6 и далее, пока остатка хватает на следующее число. Ненулевой остаток прибавьте к последней части; количество частей останется максимальным.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дано неотрицательное целое n. Верните максимально длинный список различных положительных чётных чисел с суммой n. Для нечётного n верните []; для 0 — []. Например, 10 → [2,8], 12 → [2,4,6].
Ответ
Жадно берите 2, 4, 6 и далее, пока остатка хватает на следующее число. Ненулевой остаток прибавьте к последней части; количество частей останется максимальным.
Решение:
def even_parts(n: int) -> list[int]:
if n < 0:
raise ValueError('negative length')
if n % 2 or n == 0:
return []
result, part = [], 2
while n >= part:
result.append(part)
n -= part
part += 2
result[-1] += n
return result
Минимальная сумма k различных положительных чётных чисел равна k(k+1), поэтому большее число частей невозможно. Время и память O(√n).