Разбор задачи: Следующий Великий Элемент 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. Алгоритм работы

  1. Инициализация структуры данных:
    • next_greater — пустой словарь для хранения результата.
    • stack — пустой стек для промежуточного хранения чисел.
  2. Обход массива nums2 в обратном порядке:
    • Цель — найти следующий больший элемент для каждого числа.
  3. Для каждого числа num из nums2:
    • Удаляются все элементы из стека, которые меньше либо равны текущему числу num:

      while stack and stack[-1] <= num:
          stack.pop()
      

      Эти элементы нельзя считать следующими большими для num (они меньше него).

    • Если стек не пуст, то верхний элемент стека — это следующий больший элемент:

      next_greater[num] = stack[-1]
      
    • Если стек пуст, следующего большего элемента нет:

      next_greater[num] = -1
      
    • Текущее число добавляется в стек:

      stack.append(num)
      
  4. Заполнение результата для чисел из nums1:
    • Для каждого числа из nums1 результат извлекается из словаря next_greater:

      return [next_greater[num] for num in nums1]
      

4. Пример работы алгоритма

Пример:

nums1 = [4, 1, 2]
nums2 = [1, 3, 4, 2]
  1. Обработка nums2 справа налево:

    • num = 2: нет большего элемента справа → next_greater[2] = -1, стек = [2].
    • num = 4: нет большего элемента справа → next_greater[4] = -1, стек = [4].
    • num = 3: следующий больший элемент — 4next_greater[3] = 4, стек = [4, 3].
    • num = 1: следующий больший элемент — 3next_greater[1] = 3, стек = [4, 3, 1].

    Словарь next_greater:

    {
        1: 3,
        3: 4,
        4: -1,
        2: -1
    }
    
  2. Результат для nums1:
    • 4 → -1
    • 1 → 3
    • 2 → -1

Результат:

[-1, 3, -1]

 



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