Разбор задачи: Найди самую маленькую букву больше цели

Предложенный нами код решения:

def nextGreatestLetter(letters, target):
    """
    :param letters: Список символов, отсортированный в неубывающем порядке.
    :param target: Целевой символ.
    :return: Наименьший символ в letters, который лексикографически больше target.
    """
    for letter in letters:
        if letter > target:
            return letter
    return letters[0]  # Если подходящий символ не найден, вернуть первый символ.

Алгоритм решения

  1. Итерация по списку:

    for letter in letters:
        if letter > target:
            return letter
    
    • Мы проходим по каждому символу в списке letters.
    • Сравниваем текущий символ letter с целевым символом target.
    • Если находим символ, который лексикографически больше target, сразу возвращаем его.
  2. Обработка случая, когда подходящего символа нет:

    return letters[0]
    
    • Если перебор завершился, и не нашлось ни одного символа, который больше target, возвращаем первый символ в списке letters.

Преимущества данного решения

  1. Простота реализации:
    • Используется линейный проход по списку, что делает код легко читаемым и понятным.
  2. Обработка крайних случаев:
    • Если все символы меньше или равны target, код корректно возвращает первый символ списка.

Пример выполнения

Пример 1:

letters = ["c", "f", "j"]
target = "a"
  1. Перебор:
    • 'c' > 'a' → Возвращаем 'c'.

Пример 2:

letters = ["c", "f", "j"]
target = "c"
  1. Перебор:
    • 'c' ≯ 'c'.
    • 'f' > 'c' → Возвращаем 'f'.

Пример 3:

letters = ["x", "x", "y", "y"]
target = "z"
  1. Перебор:
    • Все символы ('x', 'x', 'y', 'y') ≯ 'z'.
  2. Возвращаем первый символ: 'x'.

 



Комментарии

Filaret_avatar
Filaret
,
15 дней назад

В исходном условии есть такая строка: "letters — ... (список строк длиной ... до 10410^4104)". Если это не опечатка, то понимать это следует как 10410 в степени 4104. Т.е. потенциально, я так понимаю, на вход может быть подан список ОЧЕНЬ БОЛЬШОЙ длины. В связи с этим вопрос: почему предлагается просто перебрать весь список, а не воспользоваться алгоритмом бинарного поиска? Я всего лишь хочу разобраться.

1
admin_avatar
admin
,
14 дней назад

Filaret, Это просто ошибка в условии, там 10^4 должно быть, я исправил. В контексте десятков тысяч алгоритм линейной сложности легко справится, но для чисел за сотню тысяч лучше конечно использовать бинарный поиск с логарифмической сложностью, где мы можем брать постоянно середину интервала, отсекая половину. Бинарный поиск эффективно использует отсортированность массива и благодаря ней он и работает. Спасибо что заметили.

1

Вы должны Войти или Зарегистрироваться чтобы оставлять комментарии