该算法还是比较简单的。一共分为三步,即:1. 找位置;2. 交换;3. 倒序。下面结合具体例子{3,7,9,8,6,2}来进行说明。
1. 找位置。从末尾开始往前找到第一个降序的位置。如上述例子中,第一个降序的位置为1,值为7。再从该位置的后面部分找到从后往前找到第一个比该值大的数,即8,位置为3.
2. 交换。对上述找到的位置的值进行交换。序列变成了{3,8,9,7,6,2}。
3. 倒序。对第一个降序位置后面的部分进行倒序,即把{9,7,6,2}倒序为{2,6,7,9}。
代码如下:
class Solution {
public:
void nextPermutation(vector<int> &num) {
int p,q,i,t=0;
int guard;
int N=num.size();
if(num.size()<2)
return;
p=N-1;
while(p>0&&num[p-1]>=num[p])
{
p--;
}
p--;
if(p>=0)
{
for(i=N-1;i>p;i--)
{
if(num[i]>num[p])
{
break;
}
}
t=num[p];
num[p]=num[i];
num[i]=t;
}
p=p+1;
q=N-1;
while(p<q)
{
t=num[p];
num[p]=num[q];
num[q]=t;
p++;q--;
}
}
};