31. 下一个排列(Medium)
class Solution:
### 0128 两遍扫描(44 ms,14.6 MB)
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 从右往左寻找第一个递增的元素对,得到左元素的下标i(从倒数第二个开始)
i = len(nums) - 2
while i >= 0 and nums[i] >= nums[i+1]:
i -= 1
# 仅当存在递增的元素关系时,才会执行此部分if语句
if i >= 0:
# 从右往左寻找第一个比nums[i]大的元素nums[j],得到下标j
j = len(nums) - 1
while j >= 0 and nums[i] >= nums[j]:
j -= 1
# 交换两个元素
nums[i], nums[j] = nums[j], nums[i]
# 将对应区间的元素改为递增序列
l, r = i+1, len(nums)-1
while l < r:
nums[l], nums[r] = nums[r], nums[l]
l += 1
r -= 1