Программа курса:
Разбор задачи: Найди самую маленькую букву больше цели
Предложенный нами код решения:
def nextGreatestLetter(letters, target):
"""
:param letters: Список символов, отсортированный в неубывающем порядке.
:param target: Целевой символ.
:return: Наименьший символ в letters, который лексикографически больше target.
"""
for letter in letters:
if letter > target:
return letter
return letters[0] # Если подходящий символ не найден, вернуть первый символ.
Алгоритм решения
Итерация по списку:
for letter in letters: if letter > target: return letter- Мы проходим по каждому символу в списке
letters. - Сравниваем текущий символ
letterс целевым символомtarget. - Если находим символ, который лексикографически больше
target, сразу возвращаем его.
- Мы проходим по каждому символу в списке
Обработка случая, когда подходящего символа нет:
return letters[0]- Если перебор завершился, и не нашлось ни одного символа, который больше
target, возвращаем первый символ в спискеletters.
- Если перебор завершился, и не нашлось ни одного символа, который больше
Преимущества данного решения
- Простота реализации:
- Используется линейный проход по списку, что делает код легко читаемым и понятным.
- Обработка крайних случаев:
- Если все символы меньше или равны
target, код корректно возвращает первый символ списка.
- Если все символы меньше или равны
Пример выполнения
Пример 1:
letters = ["c", "f", "j"]
target = "a"
- Перебор:
- 'c' > 'a' → Возвращаем 'c'.
Пример 2:
letters = ["c", "f", "j"]
target = "c"
- Перебор:
- 'c' ≯ 'c'.
- 'f' > 'c' → Возвращаем 'f'.
Пример 3:
letters = ["x", "x", "y", "y"]
target = "z"
- Перебор:
- Все символы ('x', 'x', 'y', 'y') ≯ 'z'.
- Возвращаем первый символ: 'x'.
Filaret
,В исходном условии есть такая строка: "
letters— ... (список строк длиной ... до 10410^4104)". Если это не опечатка, то понимать это следует как 10410 в степени 4104. Т.е. потенциально, я так понимаю, на вход может быть подан список ОЧЕНЬ БОЛЬШОЙ длины. В связи с этим вопрос: почему предлагается просто перебрать весь список, а не воспользоваться алгоритмом бинарного поиска? Я всего лишь хочу разобраться.admin
,Filaret, Это просто ошибка в условии, там 10^4 должно быть, я исправил. В контексте десятков тысяч алгоритм линейной сложности легко справится, но для чисел за сотню тысяч лучше конечно использовать бинарный поиск с логарифмической сложностью, где мы можем брать постоянно середину интервала, отсекая половину. Бинарный поиск эффективно использует отсортированность массива и благодаря ней он и работает. Спасибо что заметили.