📅  最后修改于: 2023-12-03 14:53:56.177000             🧑  作者: Mango
给定一个数组,找出并返回比该数组字典序小的最大排列,如果不存在这样的排列,则返回原数组的逆序。
首先我们需要从右向左查找第一个a[i]<a[i+1]的位置i;
如果没有找到此样的位置,说明该数组已经是字典序最大的排列,因此,将数组逆序即可得到结果;
如果找到了该位置i,我们再从右到左查找第一个a[j]>a[i]的位置j,交换a[i]和a[j]的值;
最后,将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),我们只需要常数个变量用来存储数组元素。