Leecode31. 下一个排列——Leecode大厂热题100道系列

Posted 来老铁干了这碗代码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leecode31. 下一个排列——Leecode大厂热题100道系列相关的知识,希望对你有一定的参考价值。

我是小张同学,立志用最简洁的代码做最高效的表达


以下是我个人做的题解,每个题都尽量囊括了所有解法,并做到了最优解,欢迎大家收藏!留言!

传送门——>Leecode大厂热题100道系列题解


问题描述

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

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

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

示例 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


思路

这道题是根据 维基百科 ,下图所示:

翻译过来:

  • 先找出最大的索引 k k k满足 n u m s [ k ] < n u m s [ k + 1 ] nums[k] < nums[k+1] nums[k]<nums[k+1],如果不存在,就翻转整个数组;
  • 再找出另一个最大索引 l l l满足 n u m s [ l ] > n u m s [ k ] nums[l] > nums[k] nums[l]>nums[k]
  • 交换 n u m s [ l ] nums[l] nums[l] n u m s [ k ] nums[k] nums[k]
  • 最后翻转 n u m s [ k + 1 : ] nums[k+1:] nums[k+1:]

举个例子:

比如 n u m s = [ 1 , 2 , 7 , 4 , 3 , 1 ] nums = [1,2,7,4,3,1] nums=[1,2,7,4,3,1],下一个排列是什么?

我们找到第一个最大索引是 n u m s [ 1 ] = 2 nums[1] = 2 nums[1]=2

再找到第二个最大索引是 n u m s [ 4 ] = 3 nums[4] = 3 nums[4]=3

交换, n u m s = [ 1 , 3 , 7 , 4 , 2 , 1 ] nums = [1,3,7,4,2,1] nums=[1,3,7,4,2,1];

翻转, n u m s = [ 1 , 3 , 1 , 2 , 4 , 7 ] nums = [1,3,1,2,4,7] nums=[1,3,1,2,4,7]

完毕!

所以,

时间复杂度: O ( n ) O(n) O(n)

空间复杂度: O ( 1 ) O(1) O(1)

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        bool flag = true;
        int len = nums.size();
        if(len == 1) return;                    // 特判

        int p = len - 2;
        while(p >= 0) {
            if(nums[p] < nums[p + 1]) {
                flag = false;
                for(int i = len-1; i > p; i--) {
                    if(nums[i] > nums[p]) {
                        swap(nums[p], nums[i]);
                        reverse(nums.begin() + p + 1, nums.end());
                        goto loop;
                    }
                }
            }
            p--;
        }
        loop:;
        if(flag) reverse(nums.begin(), nums.end());
        return;
    }
};

以上是关于Leecode31. 下一个排列——Leecode大厂热题100道系列的主要内容,如果未能解决你的问题,请参考以下文章

Leecode240. 搜索二维矩阵 II——Leecode每日一题系列

Leecode06. Z 字形变换——Leecode大厂热题100道系列

Leecode06. Z 字形变换——Leecode大厂热题100道系列

LeeCode初级算法的Python实现--数组

Leecode 496. 下一个更大元素 I——Leecode每日一题系列

leecode 17. 电话号码的字母组合