【leetcode】Next Permutation
题意
求字典序的下一个
例子1
输入:123
生成:123、132、213、231、312、321
结果:其中132为123的下一个
例子2
输入:321
生成:123、132、213、231、312、321
结果:其中123为321(循环)的下一个
思路
任意排列:a[0],a[1]……a[n]
找到i,满足a[i]<a[i+1],且有a[i+1]>=a[i+2]……>=a[n]
从a[i+1]到a[n]中选取第一个比a[i]小的数a[k]
将a[i]与a[k]互换位置之后,将a[i+1]到a[n]倒序
则a[0],a[1]……a[n]的下一个排列为
a[0],a[1]……a[k]a[n]a[n-1]……a[k+1]a[i]a[k-1]a[i+1]
例子
排列为:236541
步骤
1、从后往前看,找到第一个不是依次增长的数,比如例子中的3,之前1456都是依次增长,记下位置p,此时p=1
2、分情况讨论
a、如果都是依次增长的,那么说明这个排列是最后一个排列,下一个就是第一个,只要把该排列逆序即可,如654321下一个是123456
b、如果p存在,从p往后找,找到第一个比他小的数,此例子中为1,然后指针挪回这个数的前一个数,此例子中为4,交换3和4的位置,此时为246531
3、最后把p之后的数倒序,即把6531倒序,得到下一个序列241356