力扣31 下乙個排序 c及python語言實現

2021-10-25 22:22:28 字數 1780 閱讀 2019

題目:

第一眼看到該題目時,若是不清楚字典序這幾個字肯定會比較懵,不過沒關係,我們可以同乙個**來直觀的看到其規律,如下:

左邊為乙個陣列序列,右邊為該序列在字典序中的下乙個序列,這是乙個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...