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 {
vector
> ret;
int N;
public:
void perm(vector
&nums, int i){
if( i == N){
ret.push_back(nums);
}
set
setNums;
for(int j = i; j < N; j++){
//没有交换过的元素才交换
if( setNums.find(nums[j])==setNums.end() )
{
setNums.insert(nums[j]);
swap(nums[i], nums[j]);
perm(nums, i + 1);
swap(nums[j], nums[i]);
}
}
}
vector
> permuteUnique(vector
& nums) { N = nums.size(); ret.clear(); perm(nums, 0); return ret; } }; //next_permute class Solution { public: //不循环 bool next_permute(vector
& nums){ if(nums.size()==0||nums.size()==1) return false; vector
::iterator itF=nums.end()-2; vector
::iterator itS=nums.end()-1; while(true) { if(*itF<*itS) { vector
::iterator tmpIt = nums.end()-1; while(*tmpIt<=*itF) tmpIt--; int tmp=*itF; *itF=*tmpIt; *tmpIt=tmp; break; } if(itF==nums.begin()) { return false; } itF--; itS--; } reverse(itS,nums.end()); return true; } vector
> permuteUnique(vector
& nums) { vector
> ret; sort(nums.begin(),nums.end()); ret.push_back(nums); while(next_permute(nums)) ret.push_back(nums); return ret; } };