Проверьте, можно ли сделать данный массив перестановкой от 1 до N, уменьшив элементы вдвое

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

Учитывая массив nums[] размера N , задача состоит в том, чтобы проверить, может ли данный массив быть преобразован в перестановку от 1 до N после выполнения заданных операций любое количество раз (может быть 0). Операция определяется как: выберите любой элемент массива, скажем , «x» , и замените его на «x/2» .

Примечание. В перестановке от 1 до N все числа в диапазоне [1, N] присутствуют в любом порядке, и каждое число присутствует только один раз.

Примеры:

Input: N = 4, nums[] = {1, 8, 25, 2}
Output: true
Explanation: Sequence of operations followed are listed below:
Replace 8 with 8/2 = 4, nums[] = {1, 4, 25, 2}
Replace 25 with 25/2 = 12, nums[] = {1, 4, 12, 2}
Replace 12 with 12/2 = 6, nums[] = {1, 4, 6, 2}
Replace 6 with 6/2 = 3, nums[] = {1, 4, 3, 2} (Here element from 1 to 4 is present exactly once)

Input: N = 4, nums[] = {24, 7, 16, 7}
Output: false

Подход: Решение задачи основано на сортировке. Создайте массив freq логического типа и размера (N+1) , чтобы отслеживать числа желаемой перестановки. Выполните следующие шаги:

  • Отсортируйте заданный массив.
  • Обход с задней части массива и на каждом шаге:
    • Если val меньше N , а freq[val] ложно , пометьте его как true.
    • Если val больше N или freq[val] истинно , разделите его на 2, тогда как (val > 0 && freq[val] == true)
    • Наконец, проверьте, достигнута ли желаемая перестановка или нет.

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


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