31. 下一个排列

https://leetcode-cn.com/problems/next-permutation/

解法一:

从后往前找降序(非严格,>=)的起点,记为i。此时[i+1,n-1]是降序(非严格),从n-1往回找第一个大于i的数j,将i,j的数交换。再将[i+1,n-1]区间逆序即可。

问题在于列表的下标逆序操作nums = nums[::-1]好像原地操作不管用,在pycharm上是管用的,这里用reverse方法代替

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        if n <= 2:            
            nums.reverse()    #长度小于等于2时,直接逆序
        else:
            i = n-2
            while i >= 0 and nums[i] >= nums[i+1]:    #找降序起点
                i -= 1
            if i == -1:    #整段都是降序,则整段逆序
                 nums.reverse()
            else:
                for j in range(n-1, i, -1):    #找比nums[i]大的最小数交换
                    if nums[j] > nums[i]:
                        nums[i], nums[j] = nums[j], nums[i]
                        break
                nums[i+1:] = nums[n-1:i:-1]    #[i+1,n-1]部分逆序

最后更新于