Given a list of numbers with duplicate number in it. Find all unique permutations.
Example
For numbers [1,2,2]
the unique permutations are:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
Challenge
Using recursion to do it is acceptable. If you can do it without recursion, that would be great!
<pre name="code" class="cpp">class Solution {
private:
// 关键是这个函数,如果之前已经有相同的交换了,这个交换就不需要了
// 1 3 2 4 2 5 2 ,第一个2和第二第三个2交换都是同一回事
bool findInPre(vector<int> &nums, int start, int end, int target) {
for (int i=start; i<end; i++)
{
if (nums[i] == target)
return true;
}
return false;
}
void swap(vector<int> &nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
void permuteUniqueHelper(vector<int> &nums, int curIdx, vector<vector<int>> &retVtr) {
if (curIdx == nums.size())
{
retVtr.push_back(nums);
return;
}
for (int i=curIdx; i<nums.size(); i++)
{
if (i>curIdx && findInPre(nums, curIdx, i, nums[i]))
continue;
swap(nums, curIdx, i);
permuteUniqueHelper(nums, curIdx+1, retVtr);
swap(nums, i, curIdx);
}
}
public:
/**
* @param nums: A list of integers.
* @return: A list of unique permutations.
*/
vector<vector<int> > permuteUnique(vector<int> &nums) {
// write your code here
vector<vector<int>> retVtr;
if (nums.size() == 0)
return retVtr;
permuteUniqueHelper(nums, 0, retVtr);
return retVtr;
}
};