全排列II
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
思路
-
首先考虑,在什么情况下出现的重复?
以
[1,1,2]
为例,分别选了第1个1
和第二个1
为开头时,会出现重复结果 -
解决方法是: 如果不选某个元素,那么和这个元素相等的后续元素也应该跳过
即,如果选了第一个1,那么后续的1就可以选
如果不选第一个1,那么后续的1也不能选
代码
class Solution {
public:
vector<vector<int>> ans;
vector<int> res;
vector<vector<int>> permuteUnique(vector<int>& nums) {
// 去重需要排序
sort(nums.begin(), nums.end());
res.resize(nums.size());
dfs(0, 0, nums);
return ans;
}
void dfs(int depth, int state, vector<int>& nums)
{
int n = nums.size();
if(depth == n)
{
ans.push_back(res);
return;
}
for(int i = 0; i < n; i++)
{
if(!(state >> i & 1))
{
// 如果当前元素和上一个位置元素相等,且上一个元素没有被选,那就应该跳过
if(i && nums[i] == nums[i - 1] && !(state >> i - 1 & 1)) continue;
res[depth] = nums[i];
dfs(depth + 1, state + (1 << i), nums);
}
}
}
};