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]
.
防止重复还是用老方法:检查之前的和自己相等的元素是否已经被用过了。
经过测试,这里如果还用那个swap的方法会有点乱,所以还是用used数组的常规方法。
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<bool> used(num.size(),false);
vector<vector<int> > result;
vector<int> answer;
sort(num.begin(),num.end());
dfs(result,answer,num,used,0);
return result;
}
void dfs(vector<vector<int> > &result, vector<int> &answer, vector<int> &num, vector<bool> &used, int depth)
{
if(depth==num.size())
{
result.push_back(answer);
return;
}
for(int i=0;i<num.size();i++)
{
if(used[i]==false)
{
if(i!=0&&num[i]==num[i-1]&&used[i-1]==false)
{
continue;
}
else
{
used[i]=true;
answer.push_back(num[i]);
dfs(result,answer,num,used,depth+1);
answer.pop_back();
used[i]=false;
}
}
}
}
};