題目:
第一眼看到該題目時,若是不清楚字典序這幾個字肯定會比較懵,不過沒關係,我們可以同乙個**來直觀的看到其規律,如下:
左邊為乙個陣列序列,右邊為該序列在字典序中的下乙個序列,這是乙個1 2 3 4不斷的按字典序變化的過程。對乙個陣列來說乙個最大的字典序應該是乙個全降序的陣列,而全公升序則為最小的字典序,可以通過對**的總結看出規律,我們要求出下乙個字典序,可以從後往前遍歷陣列,找到到乙個不符合降序排列的數字,記為左界l,進而從左界l開始往後遍歷,若是大於左界l則,往後遍歷直到尾部,否則,記為右界r,我們將左界l與右界r的前一位進行交換,進而對左界l的下一位l+1到尾部進行排序就可以得到它的下乙個序列。
**:
/*下乙個排序 c 2020/10/27 11:10 by ksks14*/
/*思路:
從右往左走,先判斷是否為最大序,即完全降序,若是,則直接快排處理。否則,
找到不符合序列的第乙個數字,記為左界,接著往後遍歷,若是這個數字一直小於後面的數字
則,一直到底,否則停止,並記錄此值為排序的右界,對左右界之間進行排序
整體過程:
1 2 4 3 ->1 3 4 2->1 3 2 4
*/static
intcmp
(const
void
*a,const
void
*b)void
nextpermutation
(int
* nums,
int numssize)
}
python實現
class
solution
:def
rever
(self,nums,l,r)
:while l
nums[l]
,nums[r]
=nums[r]
,nums[l]
l+=1 r-=
1def
nextpermutation
(self, nums)
: index=-1
for i in
range
(len
(nums)-1
,0,-
1):if nums[i-1]
: index=i
break
if index==-1
:#這裡只能在原地改動因此不能利用sorted()
nums.sort(key=
none
,reverse=0)
else
: self.rever(nums,index,
len(nums)-1
)print
(nums)
for i in
range
(index,
len(nums)):
if nums[index-1]
: nums[index-1]
,nums[i]
=nums[i]
,nums[index-1]
break
力扣 31 下乙個排列
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...
力扣 31 下乙個排列
下乙個排列 整數陣列的乙個 排列 就是將其所有成員以序列或線性順序排列。例如,arr 1,2,3 以下這些都可以視作 arr 的排列 1,2,3 1,3,2 3,1,2 2,3,1 整數陣列的 下乙個排列 是指其整數的下乙個字典序更大的排列。更正式地,如果陣列的所有排列根據其字典順序從小到大排列在乙...
力扣31 下乙個排列 加油加油
實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3 23,2,1 1,2 31,1...