给定一个数字列表,返回其所有可能的排列。
给出一个列表[1,2,3]
,其全排列为:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
每次固定一个元素,将其他的元素进行全排列,
例如
第一次固定1,将2,3进行全排列,得到[1,2,3]和[1,3,2];
第二次固定2,将2交换至第一位,得到[2,1,3],再对1,3进行全排列,得到[2,1,3]和[2,3,1];
第三次固定3,将3交换至第一位,得到[3,2,1],再对2,1进行全排列,得到[3,2,1]和[3,1,2].
public static List> permute(int[] num) {
List> lists = new ArrayList<>();
List list = new ArrayList<>();
if (num.length == 0) {
lists.add(list);
return lists;
}
perm(num, 0, num.length - 1, lists);
return lists;
}
public static void perm(int[] nums, int k, int n, List> lists) {
List list = new ArrayList<>();
if (k == n) {
for (int i = 0; i < nums.length; i++) {
list.add(nums[i]);
}
lists.add(list);
} else {
for (int i = k; i <= n; i++) {
swap(nums, k, i);
perm(nums, k + 1, n, lists);
swap(nums, k, i);
}
}
}
public static void swap(int[] num, int i, int j) {
int temp;
temp = num[j];
num[j] = num[i];
num[i] = temp;
}