1. 程式人生 > >演算法40--Next Permutation

演算法40--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).

The replacement must be in-place and use only constant extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.

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

給定一個數字序列,輸出下一個比其剛好大的序列。

思路與排列的實現差不多:

1.從後往前遍歷陣列,找到遞增的二元組,取較小者的索引為替換點

2.從替換點往後尋找一個比替換點大的最小值,即為被替換點

3.交換替換點以及被替換點的值

4.翻轉替換點之後的所有數字

例如  nums=[12543]   替換點為nums[1]=2  被替換點為nums[4]=3  交換兩者值   13542

替換點之後所有數字翻轉  13245

複習一下全排列的實現方式:

#尋找比替換點大的最小數,倒序尋找,第一個大的數就是目標值 
def findBiggerThanReplaceNum(num, r):
    min = r
    for i in range(len(num)-1, r, -1):
        if num[i]>num[r]:
            return i
    return min
    
def reverse(num, i, j):
    while i<j:
        swap(num, i, j)
        i += 1
        j -= 1
        
def fullSort3(num):
    num.sort()
    print (num)
    #替換數的下標 排序完成後第一個數
    r = len(num)-1
    #替換點的下一個數座標
    m = r
    while r>0:
        m = r    
        r -= 1
        #print ('r = ', r)
        if num[r]<num[m]:
            s = findBiggerThanReplaceNum(num, r)
            #print ('s = ',s)
            swap(num, r, s)
            reverse(num, r+1, len(num)-1)
            print (num)
            #break
            r = len(num)-1