下一个排列,下一字典序

下一个排列,下一字典序

题目

实现获取 下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

思路及证明

在这里插入图片描述
考虑一般情况,绿框中为最长递减后缀。现在要找一个序列大于该序列。
有四种情况

  • 绿框内数字交换位置

    显然只改变绿框内数字的位置是无法使序列增大。排除
  • 黄框内数字交换位置

    若只改变黄框不会比绿框和黄框交换一个数字好。因为总可以找到一个数字比黄框最后一个数字大,也就是说只用改变最后一位,不用改变红框内序列。而只在黄框内交换不可能不改变红框内序列,也就是说红框内必然比原来大,也就是说和绿框交换更优。
  • 绿框和黄框交换一个数字

    最优情况
  • 绿框和黄框交换多个数字

    和情况2一样无法让红框不变大。如果只和黄框最后一位交换,那和绿框和黄框交换一个数字的情况一样了。

综上,最优解出现在第三种情况里。我们应该从绿框中挑一个 比 黄框最后一个数字 大 的 最小数字 用来交换 。由于交换后黄框序列已经比原来的大了。绿框怎么排列也没关系了。那我们就取最小序列即升序排列。绿框交换后也还是降序排列。所有我们只要反向即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值