LeetCode 31 下一个排列

本文深入解析下一个排列算法的实现思路,通过寻找数组中最右侧的降序对,交换其后的最小大于前者的元素,并将后续子数组逆序,以获得字典序上的下一个更大排列。重温并理解该算法的关键步骤。

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

// 之前觉得从后往前找到一个a[i] > a[i - 1]将其调换就行
// 直到交了以后发现, 1 3 2 样例过不去
// 看了下解法,才发现原来不是将a[i] 与 a[i - 1]交换
// 而是要在a[i] ~ a[n]这部分找到刚好大于a[i- 1]的这个数index
// 将a[index]与a[i - 1]交换,并将 i~n处变为升序
 
//重温一下: 2022年4月13日
//思路:
// 因为要找下一个大的,
// 首先找到最右边的降序的开头的前一个
// 比如: 2 3 1 找到 2所在位置0
// 然后找到右边降序中从右往左第一个大于2的
// 将两者交换位置后, 从0之后排个序就行了
// 注意到 两者交换之后,后面一定仍然是降序
// 如果不是降序的话0所在位置之后会有比2更小的数
// 那么一开始找的就是0所在的位置了,而是0后面的位置

class Solution {
    public void nextPermutation(int[] nums) {
        int n = nums.length;
        int index = -1;
        if (n == 1) return ;

        for (int i = n - 2; i >= 0; i--) {
            if (nums[i] < nums[i + 1]){
                index = i;
                break;
            }
        }

        if (index == -1) {
            int left = 0;
            int right = n - 1;
            while(left < right) {
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
                left++;;
                right--;
            }
            return ;
        }
        int big = -1;
        for (int i = n - 1; i > index ;i --) {
            if (nums[i] > nums[index]){
                big = i;
                break;
            }
        }

        int tmp = nums[index];
        nums[index] = nums[big];
        nums[big] = tmp;
        int left = index + 1;
        int right = n - 1;
        while(left < right) {
            tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
            left++;
            right--;
        }

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值