leetcode 之 Next Permutation

題目描述:面試

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.算法

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).spa

The replacement must be in-place, do not allocate extra memory.3d

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,31,3,2
3,2,11,2,3
1,1,51,5,1code

解釋: 求下一個全排列。 認爲全排列是按順序依次排列,好比, 1, 2, 3 -》 1, 3, 2 -》 2, 1, 3 ,對於求全排列的問題,能夠採用回溯法求解(注,面試時問道了這個問題,而後被滅了~)回溯法如圖:blog

具體的回溯法求全排列,接下來再講。這裏繼續講下一個全排列的問題。it

如上圖, 對於1,3, 2來講,下一個全排列的求解,回溯至1,3,? 發現只有1,3, 2一種選擇, 繼續回溯至1,??,對於1,2 ? 必定是其前一個,而不是下一個,所以繼續回溯,至 2,?,? 的第一個即 2, 1,3.io

 

參考網上算法以下:class

1. 從右往左,找到第一個非遞增index的位置。如,1,3, 2 則找到 1.  如 7, 8, 6 ,9, 8, 7, 2 則找到 pos[2] = 6 object

2. 從右往左,找到第一個大於pos[index] 的數,1, 3, 2 即 爲2.   7,8,6,9,8,7,2 即爲 pos[5] = 7

3. 交換 index 和步驟2 找到的數。 1,3,2 -> 2, 3,1      7,8,6,9,8,7,2 -> 7,8,7,9,8,6,2

4. 將index後面的數據,翻轉。 2,3,1-> 2, 1, 3     7,8,7,9,8,6,2-> 7,8,7,2, 6, 8, 9

即獲得所需答案。代碼以下:

class Solution(object):
    def nextPermutation(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        le = len(nums)
        index = -1
        
        for i in range(le-1, 0, -1):
            if nums[i] <= nums[i-1]:
                pass
            else:
                index = i-1
                break
        if index != -1:
            for i in range(le-1, index, -1):
                if nums[i] > nums[index]:
                    nums[i], nums[index] = nums[index], nums[i]
                    break
        i = index+1
        j = le-1
        while (i <= j):
            nums[i], nums[j] = nums[j], nums[i]
            i = i + 1
            j = j - 1
        
相關文章
相關標籤/搜索