Permutations II
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
- Time: O(n) Space: O(1)
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ret = new ArrayList<>();
List<Integer> path = new ArrayList<>();
Arrays.sort(nums);
boolean[] flag = new boolean[nums.length];
permuteUniqueDfs(ret, path, nums, flag);
return ret;
}
private void permuteUniqueDfs(List<List<Integer>> ret,
List<Integer> path, int[] nums, boolean[] flag) {
if (path.size() == nums.length) {
ret.add(new ArrayList<>(path));
return;
}
for (int i = 0; i < nums.length; i++) {
if (!flag[i]) {
if (i > 0 && nums[i] == nums[i - 1] && !flag[i - 1])
continue;
flag[i] = true;
path.add(nums[i]);
permuteUniqueDfs(ret, path, nums, flag);
path.remove(path.size() - 1);
flag[i] = false;
}
}
}