Рубрики
Без рубрики

Минимальное количество прыжков [Python]

Образец ввода: [1, 5, 1, 1, 2, 1, 2] Образец выхода: 2 (1 -> 5 -> 2), мы прыгаем из индекса от 0 до 1 (1 … помечены алгоритмами, Python, Интервью, динамикапрограммирование.

Образец ввода: [1, 5, 1, 1, 2, 1, 2] Образец вывода: 2 (1 -> 5 -> 2) , мы прыгаем из индекса от 0 до 1 (1 -> 5), потому что мы можем прыгать на 1 блок далеко оттуда, а затем перейти от индекса от 1 до 6 (5 -> 2), потому что мы можем прыгать 5 единиц, и мы достигаем конец в 2 прыжках.

O (n ^ 2) время | На) Космос

Моя первая мысль была, это выглядит как вопрос динамического программирования. Поэтому я в основном хотел поддерживать массив того же размера, что и ввод, который будет содержать, какие минимальные скачки достигают какого-либо конкретного индекса.

Как мы это делаем? Сначала мы инициализируем кратчайший массив с бесконечностью. Идея должна была иметь две петли I (0 -> N-1) и J (0 -> I) и проверить, сможем ли мы достичь I от J, а если сможем, это Кратчайшее [J] + 1 Отказ Если Кратчайшее [J] + 1 тогда Кратчайший [I] [J] + 1 Отказ После того, как оба петлей сделаны, мы возвращаем последний элемент Кратчайший множество.

На) Время |. O (1) Космос

Да, это можно сделать в O (n) времени и постоянном пространстве. Трудно придумать, но такого рода выглядит как один из тех динамических проблем программирования, которые могут быть сделаны в одном проходе.

Давайте посмотрим на проблему еще раз. В любом данном индексе у нас максимальное расстояние, которое мы могли бы прыгать, если бы мы там стояли. Таким образом, мы могли бы иметь два варианта, чтобы либо продолжить предыдущий прыжок (скажем, мы прыгаем из индекса от 0 до 5, вместо того, чтобы остановиться в 3, мы продолжим наш прыжок до 5) или начать новый прыжок от текущего индекса.

Итак, в любой момент у нас есть наш максимальный доход, и мы продолжаем обновлять наш максимальный охват, когда мы продолжаем двигаться вперед. Мы также поддерживаем переменную шаги, которая в основном отслеживает, сколько шагов мы остались, прежде чем мы сможем совершить прыжок. Когда шаги достигают 0, мы назначаем текущий максимальный охват в качестве номера оставшихся шагов, потому что когда шаги достигают 0, это означает, что мы стоим на этом индексе, и самый большой прыжок отсюда будет максимально достигнут.

def minNumberOfJumps(array):
    # Time: O(n)
    # Space: O(1)

    if len(array) == 1:
        return 0

    max_reach_index = array[0]
    steps = array[0]
    jumps = 0

    for i in range(1, len(array) - 1):
        steps -= 1
        max_reach_index = max(max_reach_index, i + array[i])

        if steps == 0:
            jumps += 1
            steps = max_reach_index - i

    # Because we are going till the second last index
    # we will either have previous unfinished jump or
    # a new jump starts at second last index either way
    # we need to add a jump.
    jumps += 1

    return jumps

Оригинал: “https://dev.to/avinsharma/minumum-number-of-jumps-python-3ffd”