给定一个可包含重复数字的序列,返回所有不重复的全排列。
示例:
输入: [1,1,2] 输出: [ [1,1,2], [1,2,1], [2,1,1] ]
请问,判断重复这里,两种都可
if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) { continue; } 和 if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && vis[i - 1])) { continue; } class Solution { public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> res = new ArrayList<>(); List<Integer> temp = new ArrayList<>(); boolean[] visited = new boolean[nums.length]; Arrays.sort(nums); backtrack(res,temp, visited, nums); return res; } public void backtrack(List<List<Integer>> res,List<Integer> temp,boolean[] visited ,int[] nums) { if(temp.size()==nums.length){ res.add(new ArrayList<>(temp)); return; } for(int i =0;i<nums.length;i++){ //限制条件 //1. 没有访问过 //2. 。不是第一个数字 。该数字和上一个数字相等 。上一个数字没被访问过 就不参与后面的循环了 if(!visited[i] && (i == 0 || nums[i] != nums[i - 1] || visited[i - 1])){ temp.add(nums[i]); visited[i] = true; backtrack(res,temp, visited, nums); visited[i] = false; temp.remove(temp.size()-1); } } } }```