Loading

LeetCode 31 下一个排列

LeetCode31 下一个排列

题目描述

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

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

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

样例

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

算法分析

image-20201031155007388.png

时间复杂度\(O(n+n+n)=>O(n)\)

Java代码

class Solution {

    static void swap(int[] arr, int l, int r){
        int t = arr[l];
        arr[l] = arr[r];
        arr[r] = t;
    }

    static void reverse(int[] arr, int l, int r){
        while(l < r) swap(arr, l++, r--);
    }

    public void nextPermutation(int[] nums) {
        int n = nums.length;
        //找到升序
        int k = n - 2;
        while(k >= 0 && nums[k] >= nums[k+1]) k--;

        if(k==-1){
            //说明是全降序 5 4 3 2 1
            //最大了
            reverse(nums, 0, n-1);
        }else{
            //找到,[k+1, n-1] 中 大于 nums[k], 且最接近(就大一点点)
            //用二分
            int l = k+1;
            int r = n-1;
            while(l < r){
                int mid = l + r + 1 >> 1;
                if(nums[mid] > nums[k]) l = mid;
                else r = mid - 1;
            }

            //交换
            swap(nums, k, l);
            reverse(nums, k+1, n-1);
        }
    }
}
posted @ 2020-10-31 17:50  想用包子换论文  阅读(69)  评论(0)    收藏  举报