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
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号