Given a collection of distinct numbers, return all possible permutations.

For example,
[1,2,3] have the following permutations:

[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

思路:
采用逐一向中间集添加元素,并将当中间集元素个数等于 nums 长度的时候,将中间集添加到结果集中,并终止该层递归。

class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
dfs(res, new ArrayList<Integer>(), nums, new boolean[nums.length]);
return res;
}
private void dfs(List<List<Integer>> res, List<Integer> temp, int[] nums, boolean[] used) {
if(temp.size() == nums.length) {
res.add(new ArrayList<>(temp));
return;
}
for(int i = 0; i < nums.length; i++) {
if(!used[i]) {
used[i] = true;
temp.add(nums[i]);
dfs(res, temp, nums, used);
temp.remove(temp.size() - 1);
used[i] = false;
}
}
}
}
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = new ArrayList<>();
permute(nums,0,nums.length-1, res);
return res;
}

void permute(int[] nums,int l,int r, List<List<Integer>> res){
if(l ==r){
res.add(toList(nums));
}else{
for(int i =l;i<=r;i++){
swap(nums,i,l);
permute(nums,l+1,r, res);
swap(nums,l,i);
}
}
}

List<Integer> toList(int[] src){
List<Integer> dst = new ArrayList<>();
for(Integer n: src){
dst.add(n);
}
return dst;
}

void swap(int[]nums, int i ,int j){
int temp = nums[i];
nums[i]= nums[j];
nums[j]= temp;
}
}