题目要求
思路
1.同【没有重复项的全排列-97】这个题一样,都是递归的题,区别在于这个可能会包含重复的数字,因此,不能只是简单的通过两个值是否相等然后用标志位标记,而是新增了一个数组,这个数组专门用于存储该元素是否被使用。
2.需要特殊处理的是,类似【1,2,1】的这种的结果可能会有两个,这是因为两个1的下标不同,这时我们可以对最初的元素进行排序,如果某个元素是重复元素,并且之前已经使用过,就跳过该元素。
if(i > 0 && num[i-1] == num[i] && !vis[i-1])
continue;
代码实现
class Solution {
public:
vector<vector<int>> res;
vector<vector<int> > permuteUnique(vector<int>& num) {
sort(num.begin(), num.end());
//标记
vector<int> vis(num.size(), 0);
vector<int> n;
per(num, n, vis);
return res;
}
void per(vector<int>& num, vector<int>& n, vector<int>& vis)
{
if(num.size() == n.size())
{
res.push_back(n);
return;
}
for(int i = 0; i < num.size(); i++)
{
if(vis[i])
continue;
if(i > 0 && num[i-1] == num[i] && !vis[i-1])
continue;
vis[i] = 1;
n.push_back(num[i]);
per(num, n, vis);
vis[i] = 0;
n.pop_back();
}
}
};