1 class Solution {
2 public List<List<Integer>> permute(int[] nums) {
3 List<List<Integer>> res = new ArrayList<>();
4 int[] visited = new int[nums.length];
5 backtrack(res,nums,new ArrayList<Integer>(),visited);
6 return res;
7 }
8 private void backtrack(List<List<Integer>> res, int[] nums, ArrayList<Integer> tmp, int[] visited) {
9 if(tmp.size()==nums.length){//走到最深一层,将结果加入result
10 res.add(new ArrayList<>(tmp));// 注意,因为tmp为引用, 所以要拷贝新对象
11 return;
12 }
13 for(int i=0;i<nums.length;i++){//回溯栈
14 if(visited[i]==1)continue;//找到未访问节点
15 tmp.add(nums[i]);visited[i] = 1;//构造数组加入节点,并设置为已访问
16 backtrack(res,nums,tmp,visited);
17 tmp.remove(tmp.size()-1);visited[i]=0;//回溯,移除节点并设置为未访问
18 }
19 }
20 }