Given a collection of distinct integers, return all possible permutations.
Example:
Input: [1,2,3] Output: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]
思考:一道全排列的问题,很容易想到使用递归+回溯的方法暴力搜索出所有的排列组合
1.使用逐个添加的回溯法
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
if(nums.length<=0){
return res;
}
List<Integer> temp = new LinkedList<>();
dfs(nums,res,temp,new boolean[nums.length]);
return res;
}
public void dfs(int[] nums,List<List<Integer>> res,List<Integer> list,boolean[] isUsed){
if(list.size()==nums.length){
//找到一种排列
res.add(new LinkedList<Integer>(list));
return ;
}
for(int i=0;i<nums.length;i++){
if(!isUsed[i]){
//该元素未添加至链表中
list.add(nums[i]);
isUsed[i] = true;
dfs(nums,res,list,isUsed);
//复位
list.remove(list.size()-1);
isUsed[i] = false;
}
}
}
}
2.使用基于交换数组元素位置的回溯法
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new LinkedList<>();
if(nums.length<=0){
return res;
}
dfs(res,0,nums);
return res;
}
public static void dfs(List<List<Integer>> res,int len,int[] nums){
if(len==nums.length){
List<Integer> temp = new ArrayList<>();
for(Integer num:nums){
temp.add(num);
}
res.add(temp);
}
for(int i=len;i<nums.length;i++){
swap(nums,i,len);
dfs(res,len+1,nums);
swap(nums,i,len);
}
}
public static void swap(int[] nums,int i,int j){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}