Given a collection of numbers that might contain duplicates, return all possible unique permutations.
Input: [1,1,2]
Output:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
if(nums == null || nums.length == 0)
return list;
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
backtracking(list,new ArrayList<>(),nums,used);
return list;
}
public void backtracking(List<List<Integer>> list, List<Integer> tmpList, int[] nums, boolean[] used){
if(tmpList.size() == nums.length)
list.add(new ArrayList<>(tmpList));
else{
for(int i = 0; i < nums.length ; i++){
if(used[i] || i > 0 && nums[i-1] == nums[i] && !used[i-1]) continue;
tmpList.add(nums[i]);
used[i] = true;
backtracking(list,tmpList,nums,used);
used[i] = false;
tmpList.remove(tmpList.size()-1);
}
}
}
}