Разложение числа на максимум различных чётных частей

Жадно берите 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).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее