字典序的下一個排序--力扣每日一題
題目描述
概念和基礎知識–字典序
在數學中,字典或詞典順序(也稱為詞彙順序,字典順序,字母順序或詞典順序)是基於字母順序排列的單詞按字母順序排列的方法。 這種泛化主要在於定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為電腦科學中的單詞)的總順序。
對於數字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
下面是執行結果,我迴圈讓它在求下一個字典序,如果已經是最大了,就返回一個最小的
相關文章
- 力扣-96. 下一個更大元素 I力扣
- 力扣 204. 計數質數(每日一題)力扣每日一題
- 【每日一題】力扣1046.最後一塊石頭的重量每日一題力扣
- 力扣之按身高排序力扣排序
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 力扣#94 樹的中序遍歷力扣
- [力扣每日一題]714. 買賣股票的最佳時機含手續費力扣每日一題
- 力扣題解力扣
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- python技巧 使用值來排序一個字典Python排序
- 力扣題解-387. 字串中的第一個唯一字元力扣字串字元
- 力扣工作周刷題 - 94. 二叉樹的中序遍歷力扣二叉樹
- 力扣刷題:100. 相同的樹力扣
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- 力扣題之迴文數力扣
- 力扣之兩個陣列的交集力扣陣列
- #力扣 LeetCode面試題 04.08. 首個共同祖先 @FDDLC力扣LeetCode面試題
- LeetCode1122. 陣列的相對排序(20201114每日一題)LeetCode陣列排序每日一題
- 【Leetcode 每日一題】1030. 距離順序排列矩陣單元格(水題,曼哈頓距離排序)LeetCode每日一題矩陣排序
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- LeetCode每日一題: 按奇偶排序陣列(No.905)LeetCode每日一題排序陣列
- 力扣-349. 兩個陣列的交集力扣陣列
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- 每日一題 [26] 刪除排序陣列中的重複項每日一題排序陣列
- 力扣 147. 對連結串列進行插入排序力扣排序
- LeetCode每日一題: 按奇偶排序陣列 II(No.27)LeetCode每日一題排序陣列
- 力扣---2020.7.30力扣
- 力扣---2020.9.3力扣
- 力扣---2020.9.4力扣
- 力扣---2020.9.28力扣
- 力扣---2020.9.27力扣
- 力扣---2020.9.29力扣
- 力扣 - 劍指 Offer 58 - I. 翻轉單詞順序力扣
- 【力扣】排列問題(回溯法)(去重)力扣
- 力扣刷題——2306. 公司命名力扣
- 2024.09.22 力扣刷題 Z字形變換力扣
- 力扣題解1-兩數之和力扣
- 力扣題解2-兩數相加力扣