打卡题目:leetcode第31题,下一个排列
    相似题目:60
    image.png


    【代码】

    1. class Solution:
    2. def nextPermutation(self, nums: List[int]) -> None:
    3. """
    4. Do not return anything, modify nums in-place instead.
    5. """
    6. # nums = [1, 2, 7, 4, 3, 1]
    7. first_index = -1
    8. second_index = -1
    9. # 先找到峰值前的第一个点的索引
    10. for i in range(len(nums)-2, -1, -1):
    11. if nums[i] < nums[i+1]:
    12. first_index = i
    13. break
    14. # 再找到峰值后的第一个大于峰值前的第一个点的索引
    15. for i in range(len(nums)-1, first_index, -1):
    16. if nums[i] > nums[first_index]:
    17. second_index = i
    18. break
    19. # 交换
    20. def reverse(nums, left, right):
    21. while left < right:
    22. nums[left], nums[right] = nums[right], nums[left]
    23. left += 1
    24. right -= 1
    25. return nums
    26. if first_index != -1:
    27. nums[first_index], nums[second_index] = nums[second_index], nums[first_index]
    28. nums = reverse(nums, first_index+1, len(nums)-1)
    29. else: # 说明全逆序
    30. nums = reverse(nums, 0, len(nums)-1)
    31. return nums