LeetCode-python 31.下一個排列

題目鏈接
難度:中等 ??????類型: 數(shù)組


實現(xiàn)獲取下一個排列的函數(shù),算法需要將給定數(shù)字序列重新排列成字典序中下一個更大的排列。

如果不存在下一個更大的排列,則將數(shù)字重新排列成最小的排列(即升序排列)。

必須原地修改,只允許使用額外常數(shù)空間。

示例

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

解題思路


1376542 的下一個排列為 1423567
可以看出,需要改變的子數(shù)組的起始數(shù)為 從后往前第一個nums[i]>nums[i-1]的數(shù)k,即3
要把起始數(shù)k替換為從后往前第一個大于k的數(shù),即4,交換兩數(shù)變?yōu)?476532
翻轉(zhuǎn)i之后的一半數(shù)組

有一種特殊情況:倒序遍歷到0都沒有碰到nums[i]>nums[i-1]的情況,直接翻轉(zhuǎn)整個數(shù)組

代碼實現(xiàn)

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        i = j = n-1
        while i > 0 and nums[i-1] >= nums[i]:
            i -= 1  
        k = i - 1    # find the last "ascending" position
        if k>=0:
            while nums[j] <= nums[k]:
                j -= 1
            nums[k], nums[j] = nums[j], nums[k]  
        l, r = k+1, n-1  # reverse the second part
        while l < r:
            nums[l], nums[r] = nums[r], nums[l]
            l +=1 ; r -= 1

本文鏈接:http://www.itdecent.cn/p/735a067d9a1e

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容