20200331
题目 :全排列
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
思路 :回溯算法,不合适就回退一步。
code
class Solution{
public List<List<Integer>> permute(int[] nums){
List<List<Integer>> res = new ArrayList<>();
int[] visited = new int[nums.length];
backtrack(res,nums,new ArrayList<Integer>(),visited);
return res;
}
private void backtrack(List<List<Integer>> res,int[] nums,ArrayList<Integer> tmp, int[] visited){
if(tmp.size() == nums.length){
res.add(new ArrayList<>(tmp));
return;
}
for(int i=0;i<nums.length;i++){
if(visited[i] == 1) continue;
visited[i] = 1;
tmp.add(nums[i]);
backtrack(res,nums,tmp,visited);
//回执状态,这一步分可以看成也是被压在栈中,就算其中一次回溯完成,这一部分
//还是会全执行的。
visited[i] = 0;
tmp.remove(tmp.size() - 1);
}
}
}