给定一个可包含重复数字的序列
nums
,按任意顺序 返回所有不重复的全排列。示例 1:
输入:nums = [1,1,2] 输出: [[1,1,2], [1,2,1], [2,1,1]]示例 2:
输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
加了set去重,效率感人。
class Solution {
public:
vector<vector<int>> res;
set<vector<int>> mys;
void dfs(vector<int>& nums, int cur_n, vector<int>& cur_res){
if(cur_n == nums.size()){
vector<int> temp(cur_res);
if(mys.find(temp) != mys.end()) return ;
mys.insert(temp);
res.push_back(temp);
return ;
}
int k = cur_res.size();
for(int i = 0; i<=k; i++){
cur_res.insert(i + cur_res.begin(), nums[cur_n]);
dfs(nums, cur_n+1, cur_res);
cur_res.erase(i + cur_res.begin());
}
}
vector<vector<int>> permuteUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
vector<int> temp;
temp.push_back(nums[0]);
dfs(nums, 1, temp);
return res;
}
};