一.题目描述
给定一个可包含重复数字的序列 nums
,按任意顺序 返回所有不重复的全排列。
二.思路分析
这道题的思路是通过回溯算法暴力搜索除所有答案,重点应该在于去重,这道题有两种去重维度
将这道题类比成一棵树来看
(图片来源代码随想录)
1)同一颗树枝上已经被选取的不能再选取
使用一个布尔型的数组进行判断,初始化为假,当被选取时改为真,回溯操作时回溯为假
时
2)同一层上已经被选取的不能再选取
使用一个hash表,来存储一层中该数字是否出现过,并进行判断
三.代码实现
class Solution
{
public:
vector<vector<int>>result;
vector<int>path;
void backtracking(vector<int>nums,vector<bool>judgeCol)
{
if(path.size() == nums.size())
{
result.push_back(path);
return ;
}
vector<int>hash(21,0);
for(int i = 0;i < nums.size();++i)
{
if(judgeCol[i] == true || (hash[nums[i] + 10] == 1))
{
continue ;
}
hash[nums[i] + 10] = 1;
judgeCol[i] = true;
path.push_back(nums[i]);
backtracking(nums,judgeCol);
judgeCol[i] = false;
path.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums)
{
vector<bool>judgeCol(nums.size(),false);
vector<bool>judgeRow(nums.size(),false);
backtracking(nums,judgeCol);
return result;
}
};