Разбираем задачу Next Greater Element на LeetCode. Научитесь решать через монотонный стек за O(n). Пример кода на Python и разбор.
Эта задача — классика собеседований. Она проверяет умение применять монотонный стек для эффективного поиска следующего большего элемента. Освоив её, вы сможете решать похожие задачи: Daily Temperatures, Stock Span и другие. Мы разберём brute force и оптимальный подход на Python.
Даны два массива: nums1 (подмножество nums2). Для каждого элемента из nums1 найдите первый больший элемент справа в nums2. Если такого нет, верните -1.
nums1 = [2, 4]
nums2 = [1, 2, 3, 4]
Ответ: [3, -1]
Простой перебор: для каждого элемента nums1 находим его позицию в nums2, затем идём вправо до первого большего. Минус — повторное сканирование.
def nextGreaterElement(nums1, nums2):
ans = []
for x in nums1:
# Находим индекс x в nums2
idx = nums2.index(x)
# Ищем первый больший справа
greater = -1
for j in range(idx + 1, len(nums2)):
if nums2[j] > x:
greater = nums2[j]
break
ans.append(greater)
return ans
Заметим, что мы можем вычислить следующий больший элемент для всех элементов nums2 за один проход, используя монотонный убывающий стек. Идём справа налево, поддерживая стек, в котором на вершине — первый больший элемент для текущего.
next_greater.nums2 справа налево:-1.nums1 берём ответ из словаря.def nextGreaterElement(nums1, nums2):
stack = []
next_greater = {}
# Идём справа налево
for num in reversed(nums2):
# Удаляем все меньшие элементы из стека
while stack and stack[-1] < num:
stack.pop()
# Если стек пуст — нет большего
if not stack:
next_greater[num] = -1
else:
next_greater[num] = stack[-1]
# Кладём текущий элемент в стек
stack.append(num)
# Собираем ответ для nums1
return [next_greater[x] for x in nums1]
Возьмём nums2 = [1, 2, 3, 4].
Словарь: {4: -1, 3: 4, 2: 3, 1: 2}. Для nums1 = [2, 4] ответ: [3, -1].
Каждый элемент добавляется в стек один раз и удаляется не более одного раза. Стек всегда хранит элементы в убывающем порядке, поэтому вершина — ближайший больший элемент справа. Это даёт линейное время.
Запомните паттерн: «следующий больший элемент» → монотонный стек. Потренируйтесь на задачах Daily Temperatures и Stock Span. Напишите код прямо сейчас, засеките 15 минут — и вы закрепите навык.
Хочешь закрепить знания на практике?
Решай задачи на Algolit — интерактивная платформа для обучения
Начать бесплатно →