描述:给定一个无序数组,找到下一个按照该数组元素构成的较大的排列组合。若该数组已经是最大排列情况,则返回最小排列组合。
输入:Array={3,1,2};
输出:Array={3,2,1}。
分析;该问题即要求对区间元素进行一次排列组合,使得新的字典序大于原来的排列。如对{3,6,2,9,8}进行排列。从尾部开始先找到前面小于后面的相邻的2和9。再从尾部找起,找出第一个大于2的数字8,于是交换2和8,这样得到{3,6,8,9,2},然后反向8以后的区间元素{9,2},可得到更小的{3,6,8,2,9}。
Example: 3 6 2 9 8
Step1: 3 6
2 9 8 从尾部查找第一个小于后一位的元素:2
Step2: 3 6
2 9 8
从尾部查找第一个大于2的元素:8
Step3: 3 6
8 9 2 交换元素2和元素8
Step4: 3 6 8
2 9 反向元素8后的区间元素
class Solution{
public:
bool next_permutation(int &A[],int n)
{
if(n<2) return false;
int i=n-2;
while(A[i]>A[i+1]&&i>=0)
{
i--;
}
if(i!=0)
{
int j=n-1;
while(A[j]<A[i])
{
j--;
}
reverse(A,A+j,A+n);
return true;
}
else
{
reverse(A,A,A+n);
return false;
}
}
private:
void reverse(int &A[],int *first,int *last)
{
while(true)
if(*first==*last||*first==*(--last))
return;
else
{
int tmp=*last;
*last=*first;
*first++=tmp;
}
}
};