题目:
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]
, and [2,1,1]
.
分析:
今天男神对我说了两句话,让我小鹿乱撞。
第一句是我今天早上给他看了一件收藏夹里的衣服,他看了大概一两秒马上说了句“买”。。。啊。。。。被秒到。。
第二句是中午打算午睡了,但是还有点事情没处理好,他帮我去打了个电话,过了一会儿之后他说“搞定了”。。。。。继续被秒到。。。
回归这道题。。回溯。。但是这个解法比较好,空间使用较少,而且维护了数组的状态。
代码:
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> permuteUnique(vector<int>& nums) {
if(nums.empty())return res;
sort(nums.begin(),nums.end());
dfs(nums,0,nums.size());
return res;
}
void dfs(vector<int> nums,int s,int e){
if(s==e-1){
res.push_back(nums);
return;
}
for(int i=s;i<e;++i){
if(i!=s&&nums[i]==nums[s])continue;
swap(nums[i],nums[s]);
dfs(nums,s+1,e);
}
}
};