Проблема

Учитывая массив nums различных целых чисел, вернуть все возможные перестановки. Вы можете вернуть ответ в любом порядке.

Пример 1:

Input: nums = [1,2,3]
Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

Пример 2:

Input: nums = [0,1]
Output: [[0,1],[1,0]]

Пример 3:

Input: nums = [1]
Output: [[1]]

Ограничения:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • Все целые числа nums уникальны.

Решение

Это очень похоже на последнюю проблему (комбинации). Я использую рекурсивную вспомогательную функцию, чтобы построить все возможные перестановки.

  1. Нам понадобится два контейнера: один для финальных комбинаций, а другой для хранения временных комбинаций во время сборки.
  2. Внутри внутренней рекурсивной функции наш базовый случай будет, когда массив опций пуст. Массив параметров начинается с того же значения, что и nums.
  3. Внутри внутренней рекурсивной функции цикл for запустит процесс сборки. В каждом цикле мы будем хранить текущее добавляемое число, помещая его в наш временный комбинированный массив. Затем мы можем соединить это число из нашего массива параметров и выполнить рекурсивный вызов. Мы просто добавили новое число в наш массив и рекурсивно отправили оставшиеся числа во внутреннюю функцию, чтобы их можно было добавить.
  4. После выполнения рекурсивного вызова нам нужно позаботиться о некоторых других делах внутри цикла for. Нам нужно удалить последнее значение, чтобы мы могли добавить другие числа из нашего массива параметров в ту же позицию по одному.
  5. Помните номер, который мы сохранили на шаге 3? Теперь нам нужно снова вставить это обратно в массив параметров.

На несколько шагов больше, чем проблема комбинаций, но в целом очень похожий подход.