- vector<vector<int> > permuteUnique(vector<int> &num) {
- vector<vector<int> > ret;
- sort(num.begin(), num.end());
- ret.push_back(num);
- while(next_permutation(num.begin(), num.end()))
- {
- ret.push_back(num);
- }
- return ret;
- }
template <class BidirectionalIterator> bool next_permutation (BidirectionalIterator first,BidirectionalIterator last);
true
if the function could rearrange the object as a lexicographicaly greater permutation.
自己的解法
void solve(vector<vector<int> > &rs,vector<int> &num,int pos){
if(pos==num.size()){
rs.push_back(num);
return;
}
for(int i=pos;i<num.size();i++)
if(i==pos||(num[i]!=num[i-1]&&num[i]!=num[pos])){//这样子判定不行,因为swap之后num就不一定有序了
swap(num[pos],num[i]);
solve(rs,num,pos+1);
swap(num[pos],num[i]);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > rs;
if(num.empty())
return rs;
sort(num.begin(),num.end());
solve(rs,num,0);
return rs;
}
这样子不行,因为swap之后num就不一定有序了,最后一个case过不了
去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是第i个数与第j个数交换时,要求[i,j)中没有与第j个数相等的数
bool isSafe(int begin,int pos,vector<int> &num){
for(int i=begin;i<pos;i++)
if(num[i]==num[pos])
return false;
return true;
}
void solve(vector<vector<int> > &rs,vector<int> &num,int pos){
if(pos==num.size()){
rs.push_back(num);
return;
}
for(int i=pos;i<num.size();i++)
if(isSafe(pos,i,num)){
swap(num[pos],num[i]);
solve(rs,num,pos+1);
swap(num[pos],num[i]);
}
}
vector<vector<int> > permuteUnique(vector<int> &num) {
vector<vector<int> > rs;
if(num.empty())
return rs;
sort(num.begin(),num.end());
solve(rs,num,0);
return rs;
}