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]
.
solution: 类似Permutations的做法,但是要排除之前相等元素的情况,也就是跳过。用一个set来保存之前遍历过的数,因其不允许重复数的存在。
class Solution {
public:
void swap(vector<int> &num, int i, int j)
{
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
void perUnique(vector< vector<int> >&res, vector<int>&num, int cur, int len)
{
if(cur == len)
{
res.push_back(num);
return;
}
set<int> used;
for(int i = cur; i < len; i++)
{
if( used.find(num[i]) == used.end() )
{
swap(num, cur, i );
perUnique( res, num, cur+1, len );
swap(num, cur, i );
used.insert(num[i]);
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector< vector<int> >res;
if(num.size() <= 0)
return res;
int len = num.size();
//sort( num.begin(), num.end() );
perUnique(res, num, 0, len);
return res;
}
};