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]
.
class Solution {
public:
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int>> res;
sort(num.begin(), num.end());
dfs(res, num, 0);
return res;
}
void dfs(vector<vector<int>> &permu, vector<int> &num, int cur)
{
if(cur == num.size())
permu.push_back(num);
else
{
for(int i = cur; i < num.size(); i++)
{
if(noswap(num, i, cur)) continue;
swap(num[i], num[cur]);
dfs(permu, num, cur+1);
swap(num[i], num[cur]);
}
}
}
bool noswap(vector<int> &num, int i, int cur)
{
for(int j = cur; j < i; j++)
if(num[i] == num[j])
return true;
return false;
}
};
注意noswap的书写,从cur往后扫描,只要有一个数字跟第i个数字一样,就不交换。