LeetCode31 下一个排列

LeetCode31 下一个排列

由后向前扫数组,寻找第一个 \(nums[i] < nums[i+1]\),表示 \(i\) 之后的子数组为降序,即字典序最大

所以下一个排列则是将后面子数组中大于 \(nums[i]\) 的所有数字中的最小值与 \(nums[i]\) 交换,然后正序排列后续数组,即字典序最小

class Solution:
    def nextPermutation(self, nums: List[int]) -> None:
        i = len(nums) - 2
        while i >= 0 and nums[i] >= nums[i + 1]:
            i -= 1
        if i >= 0:
            j = len(nums) - 1
            while j >= 0 and nums[i] >= nums[j]:
                j -= 1
            nums[i], nums[j] = nums[j], nums[i]
        
        left, right = i + 1, len(nums) - 1
        while left < right:
            nums[left], nums[right] = nums[right], nums[left]
            left += 1
            right -= 1

posted on 2022-07-04 16:10  solvit  阅读(19)  评论(0编辑  收藏  举报

导航