全排列
题目链接:全排列
思路:
- 这道题做起来感觉比前面两篇文章的题目还要简单 ^ - ^
- 首先数字的个数我们不清楚,只能使用回溯法逐渐递归
- 第一次有n种选择,第二次又n-1中……直到仅有一种可选结束
- 回溯过程中传递到下一层时仅需要将当前添加的数字从数组中剔除即可
- 由于数组剔除一个数字比较麻烦,在一开始,我使用List集合复制了数组
- 当递归达到层数后,将集合添加进结果集时,又需要注意,要重新定义一个List集合,否则仅用一个内存,会导致后面的操作将该添加的值覆盖
代码:
public static List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
List<Integer> temp = new ArrayList<Integer>();
List<Integer> list = new ArrayList<Integer>();
for(int n:nums) {
list.add(n);
}
traceback(list,result,temp);
return result;
}
public static void traceback(List<Integer> nums,List<List<Integer>> result,List<Integer> temp) {
if(nums.isEmpty()) {
//重新定义集合添加至结果集
List<Integer> temp_list = new ArrayList<Integer>(temp);
result.add(temp_list);
return;
}
for(int i = 0;i<nums.size();i++) {
temp.add(nums.get(i));
//剔除nums[i]的数组
List<Integer> Later_nums = new ArrayList<Integer>(nums);
Later_nums.remove(Later_nums.get(i));
traceback(Later_nums,result,temp);
//移出添加的数,重新进入循环添加下一个数字
temp.remove(nums.get(i));
}
}