public List<List<Integer>> permuteUnique(int[] nums) { if (nums.length == 0) { return Collections.emptyList(); }
if (nums.length == 1) { List<Integer> l = new ArrayList<Integer>(1); l.add(nums[0]); return Collections.singletonList(l); }
Set<List<Integer>> ret = new HashSet<List<Integer>>(fact(nums.length)); List<Integer> path = new ArrayList<Integer>(nums.length); // boolean default to false boolean[] selected = newboolean[nums.length];
public List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> ans = new ArrayList<List<Integer>>(); List<Integer> perm = new ArrayList<Integer>(); vis = newboolean[nums.length]; Arrays.sort(nums); backtrack(nums, ans, 0, perm); return ans; }
publicvoidbacktrack(int[] nums, List<List<Integer>> ans, int idx, List<Integer> perm){ if (idx == nums.length) { ans.add(new ArrayList<Integer>(perm)); return; } for (int i = 0; i < nums.length; ++i) { if (vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])) { continue; } perm.add(nums[i]); vis[i] = true; backtrack(nums, ans, idx + 1, perm); vis[i] = false; perm.remove(idx); } } }