思路:

  1. 从后往前遍历,遇到的第一个非升序数的下标记为k,k表示“小数”;如果走出循环没有break,表示这个排列是全降序的(从前往后),因此返回全排列的第一个,也就是这个排列的逆序。
  2. 对于k后面的数,从后往前遍历,找到第一个比k大的数,对应的下标记为m,m表示“大数”,然后将“小数”和“大数”交换。 3.对于k后面的数,必然是降序的,因此做一个逆序,使得其升序。
class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        k = -1
        for i in range(len(nums)-1,0,-1):
            if nums[i] > nums[i-1]:
                k = i-1 #k即小数
                break
        if k == -1:
            nums.reverse()
        else:
            for i in range(len(nums)-1,k,-1):
                if nums[i] > nums[k]:
                    m = i#m即大数
                    break
            #交换大数和小数
            temp = nums[k]
            nums[k] = nums[m]
            nums[m] = temp
            #逆序
            nums[k+1:] = list(reversed(nums[k+1:]))

参考:https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao-/