1、题目
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
链接:https://leetcode-cn.com/problems/permutations-ii/
2、思路分析
1)回溯法
对于这种不知道各种可能都在一起的情况,最好用回溯+for循环
先将数组排序,使用perm接收现在有的数字,如果满足 perm.size() == n 则将其放入到ret中。vis 表示该位置的数字已经被取过了,不能再次取。for循环开始的时候还是要处理,重复的数字的。
将选择的数字放到perm中,然后将该位置置为1,回溯自然最后也要将其置为0,以便之后的计算。
class Solution {
public:
vector<int> vis;
void dfs(vector<int>& nums, vector<int>& perm, int n, vector<vector<int>>& ret)
{
if(perm.size() == n){
ret.push_back(perm);
return;
}
for(int i = 0; i < n; ++i){
if(vis[i] || i > 0 && nums[i] == nums[i-1] && !vis[i-1]){
continue;
}
perm.push_back(nums[i]);
vis[i] = 1;
dfs(nums, perm, n, ret);
vis[i] = 0;
perm.pop_back();
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ret;
vector<int> prem;
vis.resize(n);
sort(nums.begin(), nums.end());
dfs(nums, prem, n, ret);
return ret;
}
};