Разница в количестве различных элементов слева и справа для каждого элемента массива

Опубликовано: 21 Сентября, 2022

Учитывая массив arr[] , состоящий из N целых чисел, задача для каждого элемента массива состоит в том, чтобы найти абсолютную разницу между количеством различных элементов слева и справа от него в данном массиве arr[] .

Примеры:

Input: arr[] = {7, 7, 3, 2, 3}
Output: 2 2 0 1 2
Explanation:
Count of distinct elements that occur to the left of every index is given by [0, 0, 1, 1, 2] and the number of distinct elements that occur to the right of every index is [2, 2, 1, 0, 0]. Taking absolute difference of both gives the above output.

Input: arr[] = {4, 3, 2, 3}
Output: 2 0 1 2

Наивный подход: данная проблема может быть решена с использованием структуры данных набора, идея состоит в том, чтобы выполнить итерацию по диапазону [0, i – 1] , чтобы найти количество различных элементов слева от каждого элемента и аналогичным образом пройти массив по всему массиву. диапазон [i + 1, N – 1] , чтобы найти различные элементы справа от каждого элемента. Выполните следующие шаги, чтобы решить данную проблему:

  • Инициализируйте массив res[] , в котором хранится результирующая абсолютная разница отдельных элементов для каждого элемента массива.
  • Пройдите по заданному массиву и для каждого элемента по индексу i выполните следующие операции:
    • Переберите диапазон [0, i – 1] и вставьте все элементы в набор, скажем, S1 .
    • Переберите диапазон [i + 1, N – 1] и вставьте все элементы в набор, скажем, S2 .
    • Обновите значение res[i] как абсолютную разницу размеров наборов S1 и S2 .
  • После выполнения вышеуказанных шагов выведите в качестве результата массив res[] .

Ниже приведена реализация вышеуказанного подхода:


Временная сложность: O((N 2 )*log N)
Вспомогательное пространство: O(N)

Эффективный подход. Описанный выше подход также можно оптимизировать, сохраняя частоту отдельных элементов слева и справа для каждого элемента массива, а затем находя результирующую разницу для каждого элемента массива. Выполните следующие шаги, чтобы решить данную проблему:

  • Инициализируйте две unordered_map , leftMap и rightMap , чтобы хранить отдельные элементы слева и справа от каждого индекса соответственно.
  • Пройдите по данному массиву и вставьте все элементы массива в rightMap .
  • Пройдите по заданному массиву, используя переменную i , и выполните следующие шаги:
    • Подсчитайте отдельные элементы слева от текущего элемента (скажем, countLeft ) как размер карты leftMap .
    • Уменьшите частоту текущего элемента карты rightMap на 1 .
    • Подсчитайте отдельные элементы справа от текущего элемента (скажем, countRight ) как размер карты rightMap .
    • Увеличьте частоту текущего элемента на карте leftMap на 1 .
    • Вставьте значение абсолютной разницы размеров карт leftMap и rightMap .
  • После выполнения вышеуказанных шагов выведите в качестве результата массив res[] .

Ниже приведена реализация вышеуказанного подхода:


Временная сложность: O(N)
Вспомогательное пространство: O(N)