[LeetCode] #31 下一个排列

实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须 原地 修改,只允许使用额外常数空间。

输入:nums = [1,2,3]

输出:[1,3,2]

分三步(以68754为例)

从右往左找,比后一个数小的数(6)

从右往左找,比第一步找到的数大的第一个数,交换位置(78654)

反转这个数后面的所有数(78645

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

    public void swap(int[] nums, int a, int b){
        int temp = nums[a];
        nums[a] = nums[b];
        nums[b] = temp; 
    }

    public void reverse(int[] nums,int i){
        int left = i, right = nums.length-1;
        while(left < right){
            swap(nums, left, right);
            left++;
            right--;
        }
    }
}

知识点:

总结:

posted @ 2021-10-12 19:27  1243741754  阅读(19)  评论(0编辑  收藏  举报