leetcode 31. 下一個排列

實現獲取下一個排列的函數,算法須要將給定數字序列從新排列成字典序中下一個更大的排列。算法

若是不存在下一個更大的排列,則將數字從新排列成最小的排列(即升序排列)。函數

必須原地修改,只容許使用額外常數空間。spa

如下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1code

 

先判斷是否全是逆序;是逆序只要倒序一下就行。blog

不然從有往左,找到第一個順序,說明那裏須要修改,而後從後面挑一個最小的大於他的數,交換位置,而後把後面排序就行。排序

class Solution:
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        flag = -1
        for i in range(len(nums)-1,0,-1):
            if nums[i-1] < nums[i]:
                flag = i
                break

        if flag==-1:
            nums.sort()
        else:

            pos = flag
            minn = nums[flag]
            for i in range(flag, len(nums)):
                if minn > nums[i] and nums[i] > nums[flag-1]:
                    minn = nums[i]
                    pos = i

            nums[flag-1] , nums[pos] = nums[pos] , nums[flag-1]
            nums[flag:] = sorted(nums[flag:])
相關文章
相關標籤/搜索