leetcode31: Next Permutation python3 找規律

1Next Permutation是什麼

pre permutation 和 Next Permutation 是c++中的實現全排列前一個和下一個的函數。

排序是按照字典序,字典序,就是字符小的在前,這樣數值小。

參考:

http://www.cnblogs.com/grandyang/p/4428207.html

我理解了字典序就是:

123---》132

說明從後面數,開始降序的那個元素,'2' 選出來,在從後找比2大的數,是'3',然後交換兩者,如果兩個index之間還有數就reverse。

再看一個例子:a數組

1  2  7  4  3      3  1

1  3  7  4  3       2  1

1  3  1  2  3       4  7

1   從後往前index,開始降序是a[1]=2 ,記下index=1, 然後從後往前找比a[1]大的,一定是在 [1:end]這個範圍,因爲你之前找降序的時候就約定了肯定有比這個大的。

2   a[5]=3,比2大 和a[1] 交換

3  對index+1進行reverse。這裏用雙指針的方法,

本來想對奇數個偶數個,區別下,發現都是一個函數

問題:如果pre permutation?更改的地方  

1   從後往前index,開始升序的

2從後往前找比a[index]小的,然後交換

3 reverse

自己手敲下,運行下看看,

class Solution:
    def nextPermutation(self, nums):
        #121 543321
        # 倒數,尋找第一個下降的1  和 之前上升沒生過他的的下一個,勝過了
        ##pre pernutation的方法
        #倒數,第一個上升的, 213---》132.  2和倒數比他大的交換,
        #然後2之前的各位,從中間交換
        if not nums or len(nums)==1:return nums
        j=len(nums)-1
        while j>0:
            if nums[j-1]>=nums[j]:
                j-=1
            else:break
        #判斷是不是最後一個
        if j!=0:
            for i in range(len(nums)-1,j-1,-1):#
                if nums[j-1]<nums[i]:
                    nums[j-1],nums[i]=nums[i],nums[j-1]
                    break
        #從j開始都要降序--兩種方法--我選雙指針
        for ij in range((len(nums)-1-j+1)//2):
            start=j+ij;end=len(nums)-1-ij;
            nums[start],nums[end]=nums[end],nums[start]
        return nums
pp=Solution()
#[3,2,1]--->[1,2,3]
print(pp.nextPermutation([3,2,1]))

Runtime: 44 ms, faster than 99.84% of Python3 online submissions for Next Permutation.

顯擺下,估計leetcode沒有用python寫的(逃~)

參考java的:

https://leetcode.com/problems/next-permutation/discuss/13865/Sharing-my-clean-and-easy-understand-java-code-with-explanation

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章