• Medium | LeetCode 31. 下一个排列


    31. 下一个排列

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

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

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

    示例 1:

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

    示例 2:

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

    示例 3:

    输入:nums = [1,1,5]
    输出:[1,5,1]
    

    示例 4:

    输入:nums = [1]
    输出:[1]
    

    提示:

    • 1 <= nums.length <= 100
    • 0 <= nums[i] <= 100

    解题思路

    这样的题, 首先自己举个例子, 理清思路。比如找23541的下一个排列是24135。

    首先从右往左扫描, 找到第一个上升的数字。即找到3, 然后将这个3与后面刚好大于3的数字交换。然后将后面的部分反序。

    public void nextPermutation(int[] nums) {
        int i = nums.length - 2;
        //从右往左扫描, 找到第一个下降的数的下标 i
        while (i >= 0 && nums[i] >= nums[i + 1]) {
            i--;
        }
        if (i >= 0) { // else i < 0 代表整个数字是递减的, 当前就是最大的排列
            int j = nums.length - 1;
            // 从右往左扫描, 找到第一个大于下标i的数的下标j
            while (j >= 0 && nums[i] >= nums[j]) {
                j--;
            }
            // 交换下标为i,j的两个数
            swap(nums, i, j);
        }
        // 接着反转i后边的数组
        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 start) {
        int left = start, right = nums.length - 1;
        while (left < right) {
            swap(nums, left, right);
            left++;
            right--;
        }
    }
    
  • 相关阅读:
    foreach的使用(c#)
    ssl详解
    c#的html格式化输出(看php10012视频时想到的)
    PHP句法规则详解(转载)
    C#中Bitmap类实现对图像操作的一些方法(Asp.net(C#)放大缩小图片尺寸)
    c# 窗体最小化到托盘
    C# 中的委托和事件
    C# StringBuilder和String浅析
    c#值类型和引用类型
    后台关闭页面
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14333824.html
Copyright © 2020-2023  润新知