Problem:
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]
.
Analysis:
解法是Permutations I解法的变种。首先把数组排序。这样做的原因是可以在每次递归的时候方便去重(重复的元素不重复参与递归)。在每次递归的时候,都记录下当前已经参与过递归过的元素,并从这个元素起寻找下一个需要参与递归的元素。当当前指标是0的时候,就把得到permutation加入结果集合。(结果暂时有问题?待查!)
Solutions:
C++:
void GeneratePermutate(vector<int>& candidate_permutate, int end_index, vector<vector<int> >& results)
{
if(end_index == 0)
results.push_back(candidate_permutate);
else {
int used_element = candidate_permutate[end_index];
for(int i = end_index; i >= 0; --i) {
if(i < end_index && candidate_permutate[i] == used_element) {
for(; i >= 0; --i) {
if(candidate_permutate[i] != used_element)
break;
}
if(i < 0)
continue;
}
used_element = candidate_permutate[i];
swap(candidate_permutate[end_index], candidate_permutate[i]);
GeneratePermutate(candidate_permutate, end_index - 1, results);
swap(candidate_permutate[end_index], candidate_permutate[i]);
}
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > results;
if(num.empty())
return results;
sort(num.begin(), num.end());
GeneratePermutate(num, num.size() - 1, results);
return results;
}