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]