题目
给定一个数组
nums
,求出它所有的全排列。
- 输入
int[] nums = {1,2,3}
- 输出
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
思路
- 交换元素,得到不同组合;
- 递归;
- 回溯,还原数组。
代码
- 代码
static List<List<Integer>> res = new ArrayList<>();
public static void main(String[] args) {
int[] nums = {1,2,3};
method(nums,0);
// 输出结果
for (List<Integer> tmp : res) {
String res = "";
for (int i = 0; i < tmp.size(); i++) {
res += tmp.get(i);
}
System.out.print(res + " ");
// 换行
System.out.println();
}
}
public static void method(int[] nums,int start) {
// 递归终止条件
// 已经完成了交换
if (start == nums.length) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
list.add(nums[i]);
}
res.add(list);
return;
}
for (int i = start; i < nums.length; i++) {
// 交换, 得到不同的组合
// if 条件判断单纯的优化 如果 i == start 那么交不交换都一样
if (start != i) {
swap(nums,start,i);
}
// 递归
method(nums,start+1);
// 回溯,防止重复
if (start != i) {
swap(nums,start,i);
}
}
}
// 交换函数
public static void swap(int[] nums,int start,int i) {
int tmp = nums[start];
nums[start] = nums[i];
nums[i] = tmp;
}
- 结果: