给定一组可能包含重复项的数字,请返回所有可能的唯一排列。
(不能有重复的)
例:输入: [1,1,2]
输出:
[
[1,1,2],
[1,2,1],
[2,1,1]
]
思路:
首先,不能有重复的全排列。重点在于处理重复的数字部分。采用先排序的方式,将数组排好序。然后用回溯的方法,将数组从0开始,如果往后遍历有和此时的i 不相等的数字,就交换。直到到i=n-1结束,压入res数组,然后到倒数第二个开始比较了。所以就可以将数字插进相同的数字不同间隔位。
方法:回溯。
代码:
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
int len=nums.size();
vector<vector<int>> res;
if(len<1)
return res;
sort(nums.begin(),nums.end()); //先排序。
premu(nums,0,len,res);
return res;
}
private:
void premu(vector<int> num, int i, int j, vector<vector<int> > &res)
{
if(i==j-1)
{
res.push_back(num); //swap过了!直接压
return;
}
for(int k=i; k<j; ++k)
{
if(i!=k && num[i]== num[k] )
continue;
std::swap(num[i],num[k]);
premu(num, i+1,j,res);
}
return ;
}
};