If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1
使用STL中的思路,从后往前找一对相邻的数,在一对相邻的数中第一个元素小于第二个元素,记做*i<*ii,从后往前找到第一个元素*j,是的*j>*i,然后交换*i和*j,然后交换从*II开始(包含*ii在内)到数组末尾的序列。
void Rserve(vector<int>& vec,int begin,int end)
{
while(begin <= end)
{
swap(vec[begin],vec[end]);
begin++;
end--;
}
}
bool FindPair(vector<int>& vec,int& first,int& second)
{
int last = vec.size()-1;
for(;last>0;last--)
{
second = last;
first = last-1;
if(vec[first] < vec[second])
return true;
}
return false;
}
void nextPermutation(vector<int>& vec)
{
int first,second,index;
if(FindPair(vec,first,second))
{
index = vec.size()-1;
for(;index>=first;index--)
{
if(vec[index] > vec[first])
break;
}
swap(vec[index],vec[first]);
Rserve(vec,second,vec.size()-1);
}
} 原文地址:http://blog.csdn.net/yusiguyuan/article/details/45023775