leetcode热题100-31. 下一个排列

31. 下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

在这里插入图片描述

解题思路
1.从右至左遍历·nums,发现第一个小于右边的数nums[i],将该nums[i]之后的数排升序;2.第二层遍历nums[(i+1):],发现第一个大于nums[i]的数nums[j],交换两数,退出遍历break;3.交换了也排好序了,退出第一次层遍历return nums

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
     #i 代表从nums结尾往前递增序列的头, j代表递增序列里比nums[i - 1]大的最小的元素
        l = len(nums)
        for i in range(l - 1, -1, -1):
            if nums[i - 1] < nums[i]:# 找到了需要的 i
                break
        if i == 0: # 代表当前不存在下一个更大的序列,整体翻转即可
            nums[:] = nums[::-1]
            return nums
        
        for j in range(l - 1, i - 1, -1):
            if nums[j] > nums[i - 1]: #找到了需要的 j
                break
 
        nums[i - 1], nums[j] = nums[j], nums[i - 1]
        nums[i:] = nums[i:][::-1]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章