0
点赞
收藏
分享

微信扫一扫

下一个排列

Soy丶sauce 2022-02-14 阅读 132

之前一直用c++的next_permutation函数,也不知道其中的原理,所以用这个题来学习下。
全排列中前一个数一定小于后面的那个数,所以我们只需找到比当前这个数大,但是要尽量让他大的幅度最小
我们从最后一个数开始遍历,找到一个比后面一个数小的数,记为i,然后再从最后遍历找到一个比前面一个数小的数,记为j,交换i与j。这时候还没结束,交换后,在i后的几位数要保证是升序排列,这样才能保证大的幅度最小

class Solution {
    public void nextPermutation(int[] nums) {
        int i = nums.length-2;
        int j = nums.length-1;
        while(i>=0&&nums[i]>=nums[i+1])
            i--;
        if(i>=0){
            while(j>=0&&nums[i]>=nums[j])
                j--;
        swap(nums,i,j);
        }
        reverse(nums,i+1);
    }
    
    public void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public void reverse(int[] nums, int begin) {
        int l = begin;
        int r = nums.length-1;
        while(l<r){
            swap(nums,l,r);
            l++;
            r--;
        }
    }
}
举报

相关推荐

0 条评论