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]
.
和Permutation那题写法差不多,唯一要加的地方就是先把数组排个序,然后如果相邻的两个元素相等,那么第二个元素只有在前一个元素被用过之后才能用。
比如1,1,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);
boolean[] used = new boolean[num.length];
helper(num, res, new ArrayList<Integer>(), used, 0);
return res;
}
public void helper(int[] num, List<List<Integer>> res, List<Integer> sol, boolean[] used, int index){
if(index == num.length){
res.add(new ArrayList<Integer>(sol));
return;
}
for(int i = 0; i < num.length; i++){
if(used[i] == false){
if(i > 0 && num[i] == num[i - 1] && used[i - 1] == false){
continue;
}
sol.add(num[i]);
used[i] = true;
helper(num, res, sol, used, index + 1);
sol.remove(sol.size() - 1);
used[i] = false;
}
}
}
}