1. 思路
和上一个题目类似,只不过这个题目有重复数字,排列的时候不能有重复了。
其实算法思路一样。
只不过对于这个题目来说需要先进行排序,在递归选值的过程我们约定对于相邻两个相同的数来说,前面一个数如果没有被选,后面的这个数不能被选。这样就可以剔除掉重复的排列了。
2.代码
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> ret;
vector<int> temp(nums.size());
vector<bool> vis(nums.size());
sort(nums.begin(), nums.end());
return generate(nums, 0, ret, vis, temp);
}
vector<vector<int>>& generate(vector<int>& nums, int count, vector<vector<int>>& ret, vector<bool>& vis, vector<int>& temp)
{
if(count >= nums.size())
{
ret.push_back(temp);
return ret;
}
for(int i = 0; i < nums.size(); ++i)
{
//注意这里的判断
if(vis[i] || i > 0 && nums[i-1] == nums[i] && vis[i-1])continue;
temp[count] = nums[i];
vis[i] = true;
generate(nums, count+1, ret, vis, temp);
vis[i] = false;
}
return ret;
}
};