next_permutation()和permutation()是STL提供的用来计算下一个排列和上一个排列的算法;刷题中经常用到,比较有用。
next_permutation()
实现:
template <class iterator>
bool next_permutation(iterator first,iterator last)
{
if(first==last)return false;
iterator i=first;
if(++i==last)return false;
i=last;
--i;
for(;;)
{
iterator ii=i;
--i;
if(*i<*ii)
{
iterator j=last;
while(!(*i<*--j));
swap(*i,*j);
reverse(ii,last);
return true;
}
if(i==first)
{
reverse(first,last);
return false;
}
}
}
prev_permutation()
实现:
template <class iterator>
bool prev_permutation(iterator first,iterator last)
{
if(first==last)return false;
iterator i=first;
if(++i==last)return false;
i=last;
--i;
for(;;)
{
iterator ii=i;
--i;
if(*i>*ii)
{
iterator j=last;
while(!(*i>*--j));
swap(*i,*j);
reverse(ii,last);
return true;
}
if(i==first)
{
reverse(first,last);
return false;
}
}
}
测试:
int main() {
vector<int>temp{1,2,3};
while( ::next_permutation(temp.begin(),temp.end()))
{
for(auto &c:temp)
cout<<c<<" ";
cout<<endl;
}
temp={3,2,1};
cout<<endl;
while( ::prev_permutation(temp.begin(),temp.end()))
{
for(auto &c:temp)
cout<<c<<" ";
cout<<endl;
}
return 0;
}