字典序的下一個排序--力扣每日一題
題目描述
概念和基礎知識–字典序
在數學中,字典或詞典順序(也稱為詞彙順序,字典順序,字母順序或詞典順序)是基於字母順序排列的單詞按字母順序排列的方法。 這種泛化主要在於定義有序完全有序集合(通常稱為字母表)的元素的序列(通常稱為電腦科學中的單詞)的總順序。
對於數字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力扣
- java的字典序排序Java排序
- 力扣 204. 計數質數(每日一題)力扣每日一題
- 【每日一題】力扣1046.最後一塊石頭的重量每日一題力扣
- 力扣之按身高排序力扣排序
- 力扣#94 樹的中序遍歷力扣
- 力扣演算法題:尋找兩個正序陣列的中位數力扣演算法陣列
- 每日一題(94) - 堆排序每日一題排序
- [力扣每日一題]714. 買賣股票的最佳時機含手續費力扣每日一題
- 力扣題解-387. 字串中的第一個唯一字元力扣字串字元
- [每日一題] 第十八題:合併兩個排序的連結串列每日一題排序
- 力扣工作周刷題 - 94. 二叉樹的中序遍歷力扣二叉樹
- 力扣·33. 搜尋旋轉排序陣列力扣排序陣列
- 力扣之兩個陣列的交集力扣陣列
- python技巧 使用值來排序一個字典Python排序
- 力扣刷題-滑動視窗(字串)力扣字串
- 力扣-81. 搜尋旋轉排序陣列 II力扣排序陣列
- 力扣-349. 兩個陣列的交集力扣陣列
- 請教一個從Collection到Map保持排序順序不變的問題排序
- 力扣-83. 刪除排序連結串列中的重複元素力扣排序
- 力扣刷題-二分查詢力扣
- 力扣 面試題 17.16. 按摩師力扣面試題
- 【力扣】排列問題(回溯法)(去重)力扣
- 力扣題解1-兩數之和力扣
- 力扣題解2-兩數相加力扣
- 力扣85-最大矩形(巧妙利用上一題解答 Java版題解)力扣Java
- #力扣 LeetCode面試題 04.08. 首個共同祖先 @FDDLC力扣LeetCode面試題
- 力扣 根據數字二進位制下1的數目排序力扣排序
- 力扣 147. 對連結串列進行插入排序力扣排序
- 【每週例題】力扣 C++ 字串相乘力扣C++字串
- 每日一題 [26] 刪除排序陣列中的重複項每日一題排序陣列
- [每日一題] 第二十題:最小的k個數每日一題
- 【Leetcode 每日一題】1030. 距離順序排列矩陣單元格(水題,曼哈頓距離排序)LeetCode每日一題矩陣排序
- 力扣2589 5.16力扣
- 程式設計師如何玩轉力扣刷題?程式設計師力扣
- 力扣刷題Python筆記:括號生成力扣Python筆記
- 力扣485. 最大連續1的個數-C語言實現-簡單題力扣C語言
- 用 PHP 在 力扣 刷演算法 [尋找兩個正序陣列的中位數]{有空就更}PHP力扣演算法陣列