题目描述
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] ]
思路分析
假设我们有了当前前 i 个元素的组合,当第 i+1个元素加入时,我们需要做的是将这个元素加入之前的每一个结果,并且放在每个结果的每个位置。
以输入[1,2,3]为例,先加入1,只有一种加法,然后加入2,[1,2]或[2,1,],两种加法;再加入3,在之前的基础上,每种都有3种加法,一共就是6种。
代码
public class Permutations {
public List<List<Integer>> permute(int[] num) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
if (num.length == 0) {
return ans;
}
List<Integer> list = new ArrayList<Integer>();
list.add(num[0]);
ans.add(list);
for (int i = 1; i < num.length; i++) {
List<List<Integer>> ans1 = new ArrayList<List<Integer>>();
for (int j = 0; j <= i; j++) {
for (List<Integer> l : ans){
List<Integer> newlist = new ArrayList<Integer>(l);
newlist.add(j,num[i]); //逐个位置插入
ans1.add(newlist);
}
}
ans = ans1;
}
return ans;
}
}
结果
递归写法
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
backtrack(list, new ArrayList<>(), nums);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums){
if(tempList.size() == nums.length){
list.add(new ArrayList<>(tempList));
} else{
for(int i = 0; i < nums.length; i++){
if(tempList.contains(nums[i])) continue;
tempList.add(nums[i]);
backtrack(list, tempList, nums);
tempList.remove(tempList.size() - 1);
}
}
}