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;
}