下一个较大排列组合

来源:互联网 发布:dns的默认端口 编辑:程序博客网 时间:2024/04/30 15:47

描述:给定一个无序数组,找到下一个按照该数组元素构成的较大的排列组合。若该数组已经是最大排列情况,则返回最小排列组合。

输入: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   从尾部查找第一个大于2的元素:8

Step3:              3   6   8   9   交换元素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;}}};



0 0