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]
.
1:特殊情况,数组按照升序排序;2:递归,以及递归结束情况;3:选择其中一个进入数组,并且注意这个数字能够取到的条件
vector<vector<int> > permuteUnique(vector<int> &num)
{
vector<vector<int> > result;
if(num.size() == 0 )
{
return result;
}
int size = (int)num.size();
vector<bool> flag(size, false);
sort(num.begin(), num.end());
int number = 0;
vector<int> temp;
permuteUniqueCore(num, number, result, temp, flag);
return result;
}
void permuteUniqueCore(vector<int> &num, int number, vector<vector<int> > &result, vector<int> &temp, vector<bool> &flag)
{
if(number == (int)num.size())
{
result.push_back(temp);
return;
}
for(int i = 0; i < (int)num.size(); i++)
{
if(flag[i] == true || ( i != 0 && num[i] == num[i-1] && flag[i-1] == false))
{
continue;
}
temp.push_back(num[i]);
flag[i] = true;
permuteUniqueCore(num, number+1, result, temp, flag);
flag[i] = false;
temp.pop_back();
}
}