解法一:recursion
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
if(nums.empty()) return {};
vector<vector<int>> res;
sort(nums.begin(), nums.end());
vector<bool> visited(nums.size(), false);
vector<int> out;
helper(nums, 0, visited, out, res);
return res;
}
void helper(vector<int>& nums, int pos, vector<bool>& visited, vector<int>& out, vector<vector<int>>& res){
int n = nums.size();
if(pos==n) res.push_back(out);
else{
for(int i=0;i<n;i++){
if(!visited[i]){
if(i!=0 && nums[i-1]==nums[i] && !visited[i-1]) continue;
visited[i] = true;
out.push_back(nums[i]);
helper(nums, pos+1, visited, out, res);
out.pop_back();
visited[i] = false;
}
}
}
}
};
在同一个位置选择相同的数会造成重复
解法二:swap recursion
class Solution {
public:
vector<vector<int>> permuteUnique(vector<int>& nums) {
set<vector<int>> res;
permute(nums, 0, res);
return vector<vector<int>>(res.begin(), res.end());
}
void permute(vector<int>& nums, int start, set<vector<int>>& res){
if(start==nums.size()) res.insert(nums);
for(int i=start;i<nums.size();i++){
if(start!=i && nums[start]==nums[i]) continue;
swap(nums[start], nums[i]);
permute(nums, start+1, res);
swap(nums[start], nums[i]);
}
}
};
还是需要用set