字典序的下一個排序--力扣每日一題

熱愛程式碼的小方發表於2020-11-10

題目描述

在這裡插入圖片描述
在這裡插入圖片描述

概念和基礎知識–字典序

在數學中,字典或詞典順序(也稱為詞彙順序,字典順序,字母順序或詞典順序)是基於字母順序排列的單詞按字母順序排列的方法。 這種泛化主要在於定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為電腦科學中的單詞)的總順序。
對於數字1、2、3…n的排列,不同排列的先後關係是從左到右逐個比較對應的數字的先後來決定的。例如對於5個數字的排列 12354和12345,排列12345在前,排列12354在後。按照這樣的規定,5個數字的所有的排列中最前面的是12345,最後面的是 54321。

演算法介紹

設P是1~n的一個全排列:p=p1p2…pn=p1p2…pj-1pjpj+1…pk-1pkpk+1…pn
1)從排列的右端開始,找出第一個比右邊數字小的數字的序號j(j從左端開始計算),即 j=max{i|pi<pi+1}
2)在pj的右邊的數字中,找出所有比pj大的數中最小的數字pk,即 k=max{i|pi>pj}(右邊的數從右至左是遞增的,因此k是所有大於pj的數字中序號最大者)
3)對換pj,pk
4)再將pj+1…pk-1pkpk+1…pn倒轉得到排列p’=p1p2…pj-1pjpn…pk+1pkpk-1…pj+1,這就是排列p的下一個排列。

程式碼實現

這裡我用pycharm跑的程式碼,所以寫了return,在我的機器上是完全可以跑通的。
在leetcode沒寫return,有一部分跑不通,也不知道原因

    def check_permutation_exist(self,nums):
        lenth=len(nums)
        for i in range(0,lenth-1):
            if nums[i] < nums[i+1]:
                return True
        return False

    def nextPermutation(self, nums):
        if not (self.check_permutation_exist(nums)):
            #If it does not has any permutation, it will rearrange it as the lowest possible order
            lowest = []
            for i in range(0,len(nums)):
                lowest.append(nums[len(nums)-i-1])
            return lowest
        else:
            j=0
            k=0
            # step 1: find the first number which is smaller than its right hand number.
            for j in range(len(nums)-2,-1,-1):
                if nums[j]<nums[j+1]:
                    break
            # step 2: find the first number which is bigger than the prior one.
            for k in range(len(nums)-1,j,-1):
                if nums[k]>nums[j]:
                    break
            # step 3: swap the two numbers
            nums[k],nums[j]=nums[j],nums[k]
            # step 4:
            newnums=[]
            for i in range(0,len(nums)):
                if i < j+1:
                    newnums.append(nums[i])
                else:
                    newnums.append(nums[len(nums)-i+j])
            return newnums

下面是執行結果,我迴圈讓它在求下一個字典序,如果已經是最大了,就返回一個最小的
在這裡插入圖片描述
在這裡插入圖片描述

相關文章