由后向前扫数组,寻找第一个 \(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