leetcode-java-31. Next Permutation

本文介绍了一个高效的算法用于生成整数序列的下一个字典序排列。通过归纳分析,文章详细解释了如何通过查找减序子集并进行特定操作来获得目标序列。此方法广泛应用于排序与组合数学问题。

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

思路:
123的排序是:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
next_permutation函数将按字母表顺序生成给定序列的下一个较大的排列,直到整个序列为降序为止
归纳分析这个过程:
假设m个元素的序列pn,下一组较大排列是pn+1
1.若pn最后两个元素构成一个最小的增序序列,直接反转最后两个元素得到pn+1
2.若后面最多s个元素构成了一个减序子集
令i = m -s,保证i之前的元素不动
在(i+1)–m这些元素中,遭到仅次于但大于第i个元素,交换这两个元素
此时只要得到新子集{pn(i+1), pn(i+2), …, pn(i), …,pn(m)}的最小排列即可
注意到新子集仍保持减序,那么直接将其反转即可得到最小的增序子集。

public class Solution {
     public void nextPermutation(int[] nums) {
         int len = nums.length,
             i = len - 1,
             j = len - 1,
             temp;

        // 找到减序子集的前一个元素,是i-1
         while(i > 0 && nums[i] <= nums[i-1]) {
             i--;
         }

        //  i > 0时,找到倒叙子集中的最大值-第j个元素
         if(i > 0) {
             while(nums[j] <= nums[i-1]) {
                 j--;
             }
            //  让第i-1个元素和第j个元素交换
            temp = nums[j];
            nums[j] = nums[i-1];
            nums[i-1] = temp;
         }

        // 倒置数组
         j = len -1;
         while(i < j) {
             temp = nums[j];
             nums[j] = nums[i];
             nums[i] = temp;
             i++;
             j--;
         }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值