1. 程式人生 > 實用技巧 >Leetcode 31 Next Permutation

Leetcode 31 Next Permutation

題目介紹

找到給定陣列的字典序的下一個排列,如果不存在,應當返回最小的排列。要求原地替換數字,使用常數空間的記憶體。

Example

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

Solution

這題沒有想到好的辦法,看了大神的解法,記錄一下這種演算法。

步驟如下:

  1. 從右至左,查詢第一個nums[k]<nums[k+1]的位置,即k右邊的子序列單調不增;
  2. 如果不存在,說明整個序列單調不增,返回排完序的整個陣列;
  3. 再次從右至左,找到第一個比nums[k]更大的位置l,並且執行交換swap(nums[k], nums[l])
  4. 然後再將k右邊的序列按升序排列
class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        i = len(nums)-2
        while i >= 0:
            if nums[i] < nums[i+1]:
                break
            i -= 1
        if i < 0:
            nums[:] = nums[::-1]
        else:
            for j in range(len(nums)-1, i-1, -1):
                if nums[j] > nums[i]:
                    nums[j], nums[i] = nums[i], nums[j]
                    break
            nums[i+1:] = nums[-1:i:-1]