Программа курса:
Разбор задачи: Следующий Великий Элемент I
Предложенный нами код решения:
def next_greater_element(nums1, nums2):
"""
:param nums1: список целых чисел, являющийся подмножеством nums2
:param nums2: список целых чисел
:return: список, где для каждого элемента nums1 возвращается следующий больший элемент или -1
"""
# Словарь для хранения следующего большего элемента для каждого числа
next_greater = {}
stack = []
# Проходим по nums2 справа налево
for num in reversed(nums2):
# Удаляем элементы из стека, которые меньше текущего числа
while stack and stack[-1] <= num:
stack.pop()
# Если стек не пуст, то верхний элемент — следующий больший
next_greater[num] = stack[-1] if stack else -1
# Добавляем текущий элемент в стек
stack.append(num)
# Возвращаем результат для каждого числа из nums1
return [next_greater[num] for num in nums1]1. Функция next_greater_element
Эта функция предназначена для нахождения следующего большего элемента для каждого числа из списка nums1 на основе чисел в списке nums2.
Параметры функции:
nums1: список чисел, являющийся подмножествомnums2.nums2: список чисел, в котором осуществляется поиск следующего большего элемента.
Возвращаемое значение:
- Список чисел, где для каждого числа из
nums1находится следующий больший элемент вnums2. Если такого элемента нет, возвращается-1.
2. Идея решения
Для эффективного поиска следующего большего элемента используется подход с использованием стека и словаря:
- Словарь
next_greaterхранит соответствие числа изnums2и его следующего большего элемента. - Стек
stackпомогает отслеживать числа, для которых еще не найден следующий больший элемент.
3. Алгоритм работы
- Инициализация структуры данных:
next_greater— пустой словарь для хранения результата.stack— пустой стек для промежуточного хранения чисел.
- Обход массива
nums2в обратном порядке:- Цель — найти следующий больший элемент для каждого числа.
- Для каждого числа
numизnums2:Удаляются все элементы из стека, которые меньше либо равны текущему числу
num:while stack and stack[-1] <= num: stack.pop()Эти элементы нельзя считать следующими большими для
num(они меньше него).Если стек не пуст, то верхний элемент стека — это следующий больший элемент:
next_greater[num] = stack[-1]Если стек пуст, следующего большего элемента нет:
next_greater[num] = -1Текущее число добавляется в стек:
stack.append(num)
- Заполнение результата для чисел из
nums1:Для каждого числа из
nums1результат извлекается из словаряnext_greater:return [next_greater[num] for num in nums1]
4. Пример работы алгоритма
Пример:
nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
Обработка
nums2справа налево:num = 2: нет большего элемента справа →next_greater[2] = -1, стек =[2].num = 4: нет большего элемента справа →next_greater[4] = -1, стек =[4].num = 3: следующий больший элемент —4→next_greater[3] = 4, стек =[4, 3].num = 1: следующий больший элемент —3→next_greater[1] = 3, стек =[4, 3, 1].
Словарь
next_greater:{ 1: 3, 3: 4, 4: -1, 2: -1 }- Результат для
nums1:4 → -11 → 32 → -1
Результат:
[-1, 3, -1]