题目:
Given a collection of numbers, nums
, that might contain duplicates, return all possible unique permutations in any order.
Example 1:
Input: nums = [1,1,2] Output: [[1,1,2], [1,2,1], [2,1,1]]
Example 2:
Input: nums = [1,2,3] Output: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
Constraints:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
思路:
本题难点在于怎么处理重复数字。首先进行排序,从小到大扫描,如果遇到同样的数字则跳过,因为相同数字即便交换也不会产生新的permutation。
另外一点是swap以后直接recursion,不用再swap回来,因为如果swap回来,再往下走时会出现重复,如:[1, 2, 2],如果第一步swap后变成[2, 1, 2],第二步是[2, 2, 1],此时index到了2,完成一轮完整的recursion,再返回第一步。如果swap回来变成了[1,2 ,2],再往下i等于2时,index是0,值为1,i值为2,arr[i]=2,不相同,则又swap为[2, 2, 1],此时的第一个2是原本的第三个2,造成重复。另外此处传入的arr并不使用&,否则会改变原本sort完的顺序。
代码:
class Solution {
private:
vector<vector<int>> res;
void count(vector<int> a, int index)
{
if(index==a.size()-1)
{
res.push_back(a);
return;
}
for(int i=index;i<a.size();i++)
{
if(i!=index&&a[i]==a[index])
continue;
swap(a[i],a[index]);
count(a,index+1);
}
}
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(),nums.end());
count(nums,0);
return res;
}
};