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]
.
similar with the former question permutations, here we need to sort the array, and check multiple numbers
Java
public class Solution {
List<List<Integer>> result;
ArrayList<Integer> solu;
public List<List<Integer>> permuteUnique(int[] num) {
result = new ArrayList<>();
solu = new ArrayList<>();
int[] flag = new int[num.length];
Arrays.sort(num);
for(int i=0;i<flag.length;i++)
flag[i]=0;
genPermutation(0, num, flag);
return result;
}
public void genPermutation(int level, int[] num, int[] flag){
if(level == num.length){
result.add(new ArrayList<>(solu));
return;
}
for(int i=0;i<num.length;i++){
if(flag[i]==0){
if(i>0 && num[i]==num[i-1] &&flag[i-1]==0)
continue;
flag[i] = 1;
solu.add(num[i]);
genPermutation(level+1, num, flag);
solu.remove(level);
flag[i] = 0;
}
}
}
}
c++
class Solution {
public:
void GeneratePermuteUni(vector<vector<int>> &result,
vector<int> &solu,
int level,
vector<int> &visited,
vector<int> &num
){
if(level == num.size()){
result.push_back(solu);
return;
}
for(int i=0;i<num.size();i++){
if(visited[i]==0){
if(i>0 && num[i]==num[i-1] && visited[i-1]==0)
continue;
visited[i]=1;
solu.push_back(num[i]);
GeneratePermuteUni(result,solu,level+1,visited,num);
solu.pop_back();
visited[i]=0;
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> result;
vector<int> solution;
vector<int> visited(num.size(),0);
if(num.size() == 0) return result;
sort(num.begin(), num.end());
GeneratePermuteUni(result,solution,0,visited,num);
return result;
}
};