Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]
have the following unique permutations:
[1,1,2]
, [1,2,1]
, and [2,1,1]
.
public class Solution {
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if(num == null || num.length == 0)
return res;
Arrays.sort(num);
List<Integer> arr = new ArrayList<Integer>();
recursive(num, res, arr, new boolean[num.length]);
return res;
}
public void recursive(int[] num, List<List<Integer>> res, List<Integer> arr, boolean[] used){
if(arr.size() == num.length){
res.add(new ArrayList<Integer>(arr));
return;
}
for(int i = 0; i < num.length; i++){
//skip the duplicates
if(i > 0 && !used[i - 1] && num[i] == num[i - 1])
continue;
if(!used[i]){
used[i] = true;
arr.add(num[i]);
recursive(num, res, arr, used);
arr.remove(arr.size() - 1);
used[i] = false;
}
}
}
}