Next Permutation Algorithm,取得全排列中当前排列的下一个排列

Next Permutation算法用于找到整数数组的下一个排列,数组元素范围为0~9。算法首先找到数组中第一个不能升序的元素,然后找到其右侧最小的更大元素进行交换,再反转后续部分以保持有序。算法的时间复杂度为O(n),空间复杂度为O(1)。文章包括算法理解、时间复杂度和空间复杂度分析以及Java实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Next Permutation算法

给定一个整数数组,数组中的每一个元素均为0~9之间的整数,如下算法能够高效取得在该数组按数字从小到大排列的全排列中的下一个排列。给定一个任意整数数字,该算法亦可以用来找到仅使用该整数中的数字重构能够得到的 最小的 比当前数字大的数字。

假定输入数组为nums

  1. 找出当前数组中的 第一个 满足nums[k] < nums[k + 1]条件的索引k。如果满足该条件的索引k不存在,则当前数组为根据数字排序位于最后一位的排列。
  2. 找出当前数组中 最后一个 满足nums[j] > nums[lk]条件的索引j
  3. 调换nums[k]nums[j]的值。
  4. k+1(包含k+1)开始,翻转从k+1到最后一个位置的所有数字。

算法理解

对于任意一个数组,如果其中所有数字均为倒序排列,则当前数组为排列组合中最大的数组。反之,如果其中所有数字均为正序排列,则当前数组为排列组合中最小的数组。因此我们将数组分为两部分。

第一步我们首先寻找数组后半段中无法再增大的子数组,也就是从k+1n-1这一段。接着为了将数组增大一点,我们需要将这一段中比k大的最小的数字j与位置k的数字互换。我们需要寻找比当前数组大的最小数组(注意在我们的排序规则下越靠左的数字越大,越靠右的数字越小,类似于整数的数位),因此这一数字应当尽量小。寻找j的过程满足这一要求,也就是最后一位大于k的数字。在互换之后,数组从k+1n-1这一段仍然是倒叙排列的(因为j是其中最后一位大于k的数字,也就是说从k+1j任意一位都大于kj+1n-1任意一位都小于k),也就是这子数组最大的可能排列。又由于我们已经在k位置增大了当前数组(类比于整数中更高的数位被增大了),则我们应当尽量减小这一段子数组,所以我们应当翻转这一段来构造其可能的最小排列——顺序排列。

时间复杂度

O(n)。因为我们仅需循环整个数组一次。此处n为输入数组长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

耀凯考前突击大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值