给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
递归的退出条件为遍历结束,也就是当前下标已经超过数组限制,把数组中的元素保存到结果中,每个元素都需要存在任何一个位置,不用额外的空间保存结果,直接交换数组元素来达到不同的排列。
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
permuteInner(res, nums, 0);
return res;
}
public static void permuteInner(List<List<Integer>> res, int[] nums, int start) {
if (start >= nums.length) {
List<Integer> list = new ArrayList<>();
for (int i : nums) {
list.add(i);
}
res.add(list);
}
for (int i = start; i < nums.length; ++i) {
swap(nums, start, i);
permuteInner(res, nums, start + 1);
swap(nums, start, i);
}
}
public static void swap(int[] nums, int a, int b) {
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}