Как обрабатывать подмножество, содержащее четное количество элементов? (Найти пиковую проблему, используя разделяй и властвуй)

Это в основном весь смысл идентификатора. :) Идентификаторы специфичны, их можно использовать только один раз на странице. Классы могут использоваться как довольные.

0
задан Chuan Huang 18 January 2019 в 05:40
поделиться

1 ответ

Я рекомендую упростить вашу логику и стиль, чтобы было проще рассуждать о вашем коде. Вы постоянно вычисляете N//2, что тратит впустую циклы, и это шумно и семантически бессмысленно. Сохраните работу в переменную с именем mid в начале вашей функции, придав ей смысл. Добавьте интервал в свой код, чтобы уменьшить визуальный шум и сделать его приятным (и возможным) для пошагового выполнения.

Что касается start, end и N, это дополнительная переменная, о которой нужно думать и манипулировать - start и end достаточно для обработки всех случаев, и путаница в этих переменных кажется быть проблемой в вашем коде.

Поскольку вы уже знаете алгоритм, вы близки к решению. Однако четность массива не является проблемой - единственная проблема - это (буквально!) Крайние случаи, когда mid == 0 и mid == len(nums) - 1. В обоих этих случаях есть только один сосед, поэтому мы бы потерпели крах, если бы попытались nums[mid-1] и nums[mid+1] соответственно. Решение этих проблем - это проверка того, что mid не находится ни на одном конце массива, ни на другом, прежде чем пытаться проводить эти сравнения.

Собрав все вместе, все, что должно произойти в функции, это:

def finder(start, end):
    mid = (start + end) // 2

    if mid > 0 and nums[mid] < nums[mid-1]:
        return finder(start, mid - 1)
    elif mid < end and nums[mid] < nums[mid+1]:
        return finder(mid + 1, end)
    else:
        return mid
0
ответ дан ggorlen 18 January 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: