题目描述
给定一个 没有重复 数字的序列,返回其所有可能的全排列。
示例: 输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
解题思路
对于给定的数组元素进行重新排列,即调整各个元素在数组中的位置。
对于数组中第一个位置,原数组中的n个元素都可以存放;
对于数组中第二个位置,原数组中的n-1个元素都可以存放;
…
利用递归,依次讨论第i个位置处所放的元素。在每次循环中将还未放置的元素移动到数组的第i个位置之后
代码实现
class Solution {
public List<List<Integer>> permute(int[] nums) {
//存放最后结果
List<List<Integer>> target = new ArrayList<>();
//将待排列的元素存放到temp中
List<Integer> temp = new ArrayList<>();
for(int i =0;i< nums.length;i++){
temp.add(nums[i]);
}
//利用回溯法求解
backSort(nums,target,temp,0);
return target;
}
//回溯+递归代码实现
//num表示当前要存放元素的位置
public void backSort(int[] nums,List<List<Integer>> target,List<Integer> temp,int num){
if(num == nums.length){
//已经多所有位置的元素进行了排列
//将结果存储到结果集中
target.add(new ArrayList<Integer>(temp));
}
//依次将待排列的元素存放到num位置处
for(int i = num;i < nums.length;i++){
//将第i个元素放到num的位置上
//num位置之后的元素,全部是未排列的元素
Collections.swap(temp,num,i);
//将元素存放到num+1的位置处
backSort(nums,target,temp,num+1);
//回溯,将num位置处的元素取出,放回到原来位置处
Collections.swap(temp,i,num);
}
}
}