下一个较大排列组合

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

输入: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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值