📌  相关文章
📜  打印给定字符串的所有按字典顺序排列的较大排列(1)

📅  最后修改于: 2023-12-03 15:10:02.516000             🧑  作者: Mango

打印给定字符串的所有按字典顺序排列的较大排列

本题要求按字典顺序排列给定字符串的所有较大排列。思路是:从后往前找到第一个比后面数字小的数,然后在后面的数字中找到比它大的最小数,交换这两个数字,再把原来的后面的数字全部翻转即可。

思路
  1. 从后往前找到第一个比后面数字小的数。如果没有,说明已经是最大排列,返回原字符串。
  2. 在后面的数字中找到比它大的最小数。
  3. 交换这两个数字。
  4. 把原来的后面的数字全部翻转。
代码
class Solution:
    def nextPermutation(self, 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 >= 0 and nums[j] <= nums[i]:
            j -= 1
        nums[i], nums[j] = nums[j], nums[i]
        nums[i+1:] = nums[i+1:][::-1]
复杂度
  • 时间复杂度:$O(n)$,其中 $n$ 为数组长度。
  • 空间复杂度:$O(1)$