题目描述:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,[1,1,2]
have the following unique permutations:
[ [1,1,2], [1,2,1], [2,1,1] ]
数组中可能存在重复的数,求所有不重复的排列方式。使用递归,记录当前结果和没加入结果中的数组元素,对每个没有加入当前结果中的元素都做递归,可以考虑到所有可能到排列情况,但是为了避免重复,在同一层递归中,每个数只能出现一次,所以对于多个相同的数,可以定义一个map记录访问情况,如果已经在之前到同层递归中访问过,那么就直接跳过。
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>> result;
vector<int> cur;
DFS(nums,cur,result);
return result;
}
void DFS(vector<int> nums, vector<int> cur, vector<vector<int>>& result){
if(nums.size()==0)
{
result.push_back(cur);
return;
}
map<int,bool> visited;
vector<int> temp_cur=cur;
vector<int> temp_nums=nums;
for(int i=0;i<nums.size();i++)
{
if(visited.count(nums[i])==0)
{
visited[nums[i]]=true;
cur.push_back(nums[i]);
nums.erase(nums.begin()+i);
DFS(nums,cur,result);
nums=temp_nums;
cur=temp_cur;
}
else continue;
}
}
};