下一个排列

本文介绍了一个高效的算法,用于找出整数排列中字典序的下一个排列。如果不存在下一个排列,则输出字典序最小的序列。文章详细解释了算法的三个核心步骤:定位非最大字典序元素、找到合适的大于该元素的值并交换、将后续子序列调整为最小字典序。

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

给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。

如果没有下一个排列,则输出字典序最小的序列。

样例

左边是原始排列,右边是对应的下一个排列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

思路:

1、先从右到左找到第一个不属于非最大字典序排列的元素L,若没找到,即原序列为最大字典序,直接排序返回

2、再从右到左找到第一个比L大的元素R,并将其和L交换值;

3、将L后的子序列变为最小子序列。返回


public class Solution {
    /**
     * @param nums: an array of integers
     * @return: return nothing (void), do not return anything, modify nums in-place instead
     */
    public void nextPermutation(int[] nums) {
        // write your code here
        
        int L = nums.length-2;
        while(L>=0&&nums[L] >= nums[L+1])
            --L;
        if(L<0){
            Arrays.sort(nums);
            return;
        }
        // find the max which lower than nums[L]
        int R = nums.length-1;
        while(nums[R] <= nums[L])
            --R;
        
        nums[R] += nums[L];
        nums[L] = nums[R] - nums[L];
        nums[R] = nums[R] - nums[L];
        
        int[] t = new int[nums.length-L-1];
        for(int i=0;i<t.length;++i)
            t[i] = nums[i+L+1];
        Arrays.sort(t);
        for(int i=0;i<t.length;++i)
            nums[i+L+1] = t[i];
        return ;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值