zoukankan      html  css  js  c++  java
  • 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--;
        }
    }
    
  • 相关阅读:
    evernote100个做笔记的好方法
    平衡二叉树的调整模版
    晨间日记的奇迹
    hdu 2952 Counting Sheep
    hdu 1535 Invitation Cards
    poj 3259 Wormholes(spfa)
    poj 2263 Heavy Cargo(floyd)
    poj 3268 Silver Cow Party(SPFA)
    hdu 1690 Bus System
    hdu 3631 Shortest Path(Floyd)
  • 原文地址:https://www.cnblogs.com/chenrj97/p/14333824.html
Copyright © 2011-2022 走看看