可以加set,但慢。
看了题解,这个剪枝好。里面的判断flag[i-1],如果flag[i-1]=1,说明前面那个数在本次排列用过了,那这个相同的数可以继续用;如果flag[i-1]=0,说明前面那个数字已经是另一个排列了,这个数不能再用了,用了会重复。
vector<vector<int>> permuteUnique(vector<int>& nums) {
vector<vector<int>>ans;
vector<int>flag(nums.size(),0);
vector<int>tep;
sort(nums.begin(),nums.end());
dfs(ans,nums,flag,tep);
return ans;
}
void dfs(vector<vector<int>>& ans,vector<int> nums,vector<int>& flag,vector<int> tep){
if(tep.size()==nums.size()){
ans.push_back(tep);
return;
}
for(int i=0;i<nums.size();i++){
if(flag[i]==0){
if(i>0&&nums[i]==nums[i-1]&&flag[i-1]==0){
continue;
}
flag[i]=1;
tep.push_back(nums[i]);
dfs(ans,nums,flag,tep);
flag[i]=0;
tep.pop_back();
}
}
}