Use recursive backtracking. Maintain a state of used elements or swap elements in-place to construct all permutations of length N.
class Solution:
def permute(self, nums: list[int]) -> list[list[int]]:
res = []
def backtrack(start):
if start == len(nums):
res.append(nums[:])
return
for i in range(start, len(nums)):
# Swap
nums[start], nums[i] = nums[i], nums[start]
# Recurse
backtrack(start + 1)
# Backtrack
nums[start], nums[i] = nums[i], nums[start]
backtrack(0)
return res
class Solution {
public List> permute(int[] nums) {
List> res = new ArrayList<>();
backtrack(0, nums, res);
return res;
}
private void backtrack(int start, int[] nums, List> res) {
if (start == nums.length) {
List list = new ArrayList<>();
for (int num : nums) list.add(num);
res.add(list);
return;
}
for (int i = start; i < nums.length; i++) {
swap(nums, start, i);
backtrack(start + 1, nums, res);
swap(nums, start, i);
}
}
private void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}