下一个排列,下一字典序
题目
实现获取 下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
思路及证明
考虑一般情况,绿框中为最长递减后缀。现在要找一个序列大于该序列。
有四种情况
-
绿框内数字交换位置
显然只改变绿框内数字的位置是无法使序列增大。排除 -
黄框内数字交换位置
若只改变黄框不会比绿框和黄框交换一个数字好。因为总可以找到一个数字比黄框最后一个数字大,也就是说只用改变最后一位,不用改变红框内序列。而只在黄框内交换不可能不改变红框内序列,也就是说红框内必然比原来大,也就是说和绿框交换更优。 -
绿框和黄框交换一个数字
最优情况 -
绿框和黄框交换多个数字
和情况2一样无法让红框不变大。如果只和黄框最后一位交换,那和绿框和黄框交换一个数字的情况一样了。
综上,最优解出现在第三种情况里。我们应该从绿框中挑一个 比 黄框最后一个数字 大 的 最小数字 用来交换 。由于交换后黄框序列已经比原来的大了。绿框怎么排列也没关系了。那我们就取最小序列即升序排列。绿框交换后也还是降序排列。所有我们只要反向即可。