leetcode熱題100-31. 下一個排列

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]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章