先看一眼题:
思路:使用回溯的思想
每次限放进去一个数,然后分别讨论后面每个数放进去一个的情况
例:
数组为1,2,3
·目前未使用数组为[1,2,3]。放进去1,list为[1]递归的看后面
··目前未使用的数组为[2,3]。放进去2,list为[1,2]递归的看后面
···目前未使用的数组为[3],放进去3,list为[1,2,3],list长度等于数组长度,递归结束,把list放入结果数组resList中。然后把3拿出来
··把2拿出来,目前未使用的数组为[2,3],放进去3,list为[1,3]递归的看后面
···目前未使用的数组为[2],放进去2,list为[1,3,2],list长度等于数组长度,递归结束,把list放入结果数组resList中。然后把2拿出来
…
代码如下:
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> resList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
__permute(list, nums, 0,resList);
return resList;
}
//固定一个数,递归的排列后面的数
public void __permute(List<Integer> list, int[] nums, int index,List<List<Integer>> resList) {
for (int i = index; i < nums.length; i++) {
//nums[i]交换顺序到第一个位置,index为起始位置
int temp = nums[i];
nums[i]=nums[index];
nums[index]=temp;
list.add(nums[index]);
if(list.size()==nums.length){
resList.add(new ArrayList<>(list));
}
__permute(list,nums,index+1,resList);
//用完以后先换回来,再去掉
temp = nums[i];
nums[i]=nums[index];
nums[index]=temp;
list.remove(list.size()-1);
}
}