Permutation
class Solution { List<List<Integer>> res = new ArrayList<List<Integer>>(); int visited[]; public List<List<Integer>> permute(int[] nums) { visited = new int[nums.length]; //foreach pos, get tall number ArrayList<Integer> pos = new ArrayList<>(); back(pos,nums, visited); return res; } void back(ArrayList<Integer> pos, int[] nums, int[] visited){ if(pos.size()>=nums.length){ List<Integer> temp =new ArrayList<>(pos);//!!!!!!!!!!!why copy this, immunatable like string (always deal with only one list) res.add(temp); return; } for(int i = 0; i<nums.length; i++){ if(visited[i]==0){ pos.add(nums[i]); visited[i] = 1;//index of nums back(pos, nums,visited); visited[i] = 0; pos.remove(pos.size()-1); } } } }
the structure of backtracking
why copy the list
generic list
47: duplicate elements
if contains the element
class Solution { List<List<Integer>> res = new ArrayList<List<Integer>>(); int visited[]; public List<List<Integer>> permuteUnique(int[] nums) { visited = new int[nums.length]; //foreach pos, get tall number ArrayList<Integer> pos = new ArrayList<>(); back(pos,nums, visited); return res; } void back(ArrayList<Integer> pos, int[] nums, int[] visited){ if(pos.size()>=nums.length){ List<Integer> temp =new ArrayList<>(pos);//!!!!!!!!!!!why copy this, immunatable like string (always deal with only one list) if(!res.contains(temp)) res.add(temp); return; } for(int i = 0; i<nums.length; i++){ if(visited[i]==0){ pos.add(nums[i]); visited[i] = 1;//index of nums back(pos, nums,visited); visited[i] = 0; pos.remove(pos.size()-1); } } } }
why both using visited array
Because we can only use each element once