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]
.
Idea:
Permutations II is extension of Permutations thatThis time, there are duplicated elements in Array, so result will be
duplicated as well, but we do not want this happened.
As we know, in Permutations problem, we generate each permutation list by
using loop recursion. Thus, all we need to do here just to skip recursion
step if there is duplicated elements exist.
Do not forget: The Array need to be sorted first in order to do duplication detection.
num: set of numbers
visited[num.length]: set of checker in length of num's set
curr: a list containing current combination
res: result of list contain all combinations
public class Solution {
public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
ArrayList<ArrayList<Integer>> res=new ArrayList<ArrayList<Integer>>();
if(num.length==0) return res;
Arrays.sort(num);
helperDFS(num, new boolean[num.length], res, new ArrayList<Integer>());
return res;
}
private static void helperDFS(int[] num,boolean[] visited,ArrayList<ArrayList<Integer>> res, ArrayList<Integer> curr){
if(curr.size()==num.length){
res.add(new ArrayList<Integer>(curr));
return;
}
//loop recursion start
for(int i=0;i<num.length;i++){
//skip recursion for duplicated elements
//do forget that i must greater than 0 to avoid exception + visited[i-1] is unchecked
// + num[i] and num[i-1] are equal
if(i>0 && visited[i-1]==false && num[i]==num[i-1]) continue;
if(visited[i]==false){
visited[i]=true;
curr.add(num[i]);
helperDFS(num,visited,res,curr);
//remove the last number after completed a permutation
curr.remove(curr.size() - 1);
visited[i]=false;
}
}
}
}