【LeetCode】31. 下一个排列【中等】

简介: 【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. 我们可以将该问题形式化地描述为:给定若干个数字,将其组合为一个整数。如何将这些数字重新排列,以得到下一个更大的整数。如 123 下一个更大的数为 132。如果没有更大的整数,则输出最小的整数。
  2. 我们希望下一个数字比 当前的数字大,这样才能满足 下一个排列 的定义。因此只需要 将后面的【大数】与前面的【小数】交换,就能得到一个更大的数。比如:123456,将 56 进行交换即可,就能得到一个更大的数字 123465
  3. 我们希望下一个数字增幅尽量的小,这样才满足下一个排列与当前排列紧邻的要求,为了满足这个要求,我们需要
  • 尽可能靠右的低位 进行交换,需要 从后往前 扫描
  • 将一个 尽可能小的【大数】前面的【小数】 交换。比如 123465,下一个排列应该把 54 交换而不是把 64 交换
  • 将【大数】换到前面后,需要将大数后面的所有数 重新进行排序,保证升序序列就是最小的排列
  • 123465 为例,我们在将 54 交换后,得到 123564,然后需要将 5 之后的数重新进行排序,也就是 123546

题目代码

public void nextPermutation(int[] nums) {
        if(nums.length == 0 || nums.length == 1){
            return;
        }
        int i = nums.length - 2;
        while(i >= 0 && nums[i] >= nums[i+1]){
            i--;
        }
        if(i >= 0){
            int j = nums.length - 1;
            while(j >= 0 && nums[j] <= nums[i]){
                j--;
            }
            swap(nums, i, j);
        }
        resver(nums, i + 1, nums.length - 1);
    }
    public void swap(int[] nums, int i, int j){
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
    public void resver(int[] nums, int start, int end){
        while(start <= end){
            swap(nums, start, end);
            start++;
            end--;
        }
    }


相关文章
|
7月前
|
测试技术
leetcode-1592:重新排列单词间的空格
leetcode-1592:重新排列单词间的空格
51 0
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
【Leetcode -441.排列硬币 -448.找到所有数组中消失的数字】
44 0
|
程序员
【Leetcode】面试题 01.02. 判定是否互为字符重排、面试题 01.04. 回文排列
目录 面试题 01.02. 判定是否互为字符重排 面试题 01.04. 回文排列
66 0
|
2月前
|
算法 C++ 容器
Leetcode第三十一题(下一个排列)
这篇文章介绍了LeetCode第31题“下一个排列”的C++解决方案,该算法通过原地修改数组来找到下一个字典序更大的排列,如果不存在则重排为字典序最小的排列。
35 0
Leetcode第三十一题(下一个排列)
|
6月前
|
存储 算法 数据挖掘
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
python 数学+减治、下一个排列法、DFS回溯法实现:第 k 个排列【LeetCode 题目 60】
|
4月前
|
算法 Java
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
56 0
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
【经典LeetCode算法题目专栏分类】【第8期】滑动窗口:最小覆盖子串、字符串排列、找所有字母异位词、 最长无重复子串
|
6月前
|
算法
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
【经典LeetCode算法题目专栏分类】【第2期】组合与排列问题系列
|
6月前
|
存储 算法 数据挖掘
LeetCode 题目 31:下一个排列【python】
LeetCode 题目 31:下一个排列【python】
|
7月前
|
容器
leetcode-31:下一个排列
leetcode-31:下一个排列
54 1