📌  相关文章
📜  小于给定数组的交换可能的字典序最大排列(1)

📅  最后修改于: 2023-12-03 14:53:56.177000             🧑  作者: Mango

小于给定数组的交换可能的字典序最大排列

问题描述

给定一个数组,找出并返回比该数组字典序小的最大排列,如果不存在这样的排列,则返回原数组的逆序。

解决思路
  1. 首先我们需要从右向左查找第一个a[i]<a[i+1]的位置i;

  2. 如果没有找到此样的位置,说明该数组已经是字典序最大的排列,因此,将数组逆序即可得到结果;

  3. 如果找到了该位置i,我们再从右到左查找第一个a[j]>a[i]的位置j,交换a[i]和a[j]的值;

  4. 最后,将i+1到n-1位置上的数逆序即可得到比该数组字典序小的最大排列。

代码实现
def nextPermutation(nums):
    """
    :type nums: List[int]
    :rtype: void Do not return anything, modify nums in-place instead.
    """
    n = len(nums)
    i = n - 2
    while i >= 0 and nums[i] >= nums[i + 1]:
        i -= 1
    if i < 0:
        nums.reverse()
        return
    j = n - 1
    while j > i and nums[j] <= nums[i]:
        j -= 1
    nums[i], nums[j] = nums[j], nums[i]
    l, r = i + 1, n - 1
    while l < r:
        nums[l], nums[r] = nums[r], nums[l]
        l += 1
        r -= 1
复杂度分析

时间复杂度:O(n),其中n为数组的长度。

空间复杂度:O(1),我们只需要常数个变量用来存储数组元素。