Решение задачи #22. Python Яндекс CodeRun, Минимум на отрезке

Опубликовано: 11.12.2024, 22:11 | Автор: hdhAI

Вариант решения задачи на языке программирования Python с Яндекс CodeRun.
Категория: Алгоритмы.
Название задачи: Минимум на отрезке.
Сложность: Средняя.
Статус решения: "Решено".

Условие задачи:
Рассмотрим последовательность целых чисел длины nn.

По ней двигается «окно» длины kk: сначала в «окне» находятся первые kk чисел, на следующем шаге в «окне» уже будут находиться kk чисел, начиная со второго, и так далее до конца последовательности.

Требуется для каждого положения «окна» определить минимум в нём.

Решение:


Python

from collections import deque

def sliding_window_min(nums, k):
    """Находит минимальное значение в каждом окне длины k.

    Args:
        nums: Список чисел.
        k: Размер окна.

    Returns:
        Список минимальных значений для каждого окна.
    """

    n = len(nums)
    q = deque()  # Дека для хранения индексов
    result = []

    for i in range(n):
        # Удаляем индексы элементов, выходящих за пределы окна
        while q and q[0] <= i - k:
            q.popleft()

        # Добавляем текущий индекс в деку
        while q and nums[q[-1]] >= nums[i]:
            q.pop()
        q.append(i)

        # Минимальное значение в текущем окне находится в начале деки
        if i >= k - 1:
            result.append(nums[q[0]])

    return result

def main():
    n, k = map(int, input().split())
    nums = list(map(int, input().split()))
    result = sliding_window_min(nums, k)
    print(*result)

if __name__ == '__main__':
    main()
	

Объяснение кода

Дека:
Используется для хранения индексов элементов, а не самих элементов. Это позволяет эффективно удалять элементы с обоих концов.

Удаление элементов:
Элементы удаляются из деки, если они выходят за пределы текущего окна или если существует меньший элемент справа.

Добавление элементов:
Текущий индекс добавляется в конец деки.

Минимальное значение:
Индекс минимального элемента в текущем окне всегда находится в начале деки.

Асимптотическая сложность:
Время работы алгоритма составляет O(n), где n - длина последовательности. Это достигается за счет того, что каждый элемент добавляется и удаляется из деки не более одного раза.

Источник решения: hdhai.com

Похожие статьи
Интересное





Warning: file_put_contents(/var/www/angella1/data/www/hdhai.com/counter/count.php): Failed to open stream: Permission denied in /var/www/angella1/data/www/hdhai.com/counter.php on line 89