【leetCode】31. 下一个排列

一、题目描述

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

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

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

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

二、解题思路 & 代码

一遍扫描

什么样子的重新排列将产生下一个更大的数字呢?我们想要创建比当前更大的排列。因此,我们需要将数字 a [ i − 1 ] a[i−1] a[i1] 替换为位于其右侧区域的数字中比它更大的数字,例如 a [ j ] a[j] a[j]
【leetCode】31. 下一个排列_第1张图片

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        def reverse(nums, start):
            i = start
            j = len(nums) - 1;
            while (i < j):
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
                j -= 1
                
        n = len(nums)
        i = n - 2
        while (i >= 0 and nums[i + 1] <= nums[i]):
            i -= 1
        if (i >= 0):
            j = n - 1;
            while (j >= 0 and nums[j] <= nums[i]):
                j -= 1
            nums[i], nums[j] = nums[j], nums[i]
        reverse(nums, i + 1)


复杂度分析

  • 时间复杂度:O(n),在最坏的情况下,只需要对整个数组进行两次扫描。
  • 空间复杂度:O(1),没有使用额外的空间,原地替换足以做到。

参考:

  1. LeetCode官方题解

你可能感兴趣的:(python,算法,数据结构,算法,leetcode,数据结构,数组)