leetcode31 下乙個排列

2021-10-03 16:50:59 字數 1412 閱讀 9177

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。必須原地修改,只允許使用額外常數空間。

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

class

solution

:def

nextpermutation

(self, nums: list[

int])-

>

none

:"""

do not return anything, modify nums in-place instead.

"""n =

len(nums)

down_index =

none

# 第一步,從後往前,找到下降點

for i in

range

(n-2,-

1,-1

):if nums[i+1]

> nums[i]

: down_index = i

break

if down_index is

notnone

:# 第二步,從後往前,找到比下降點大的數,對換位置

for j in

range

(n-1

, down_index,-1

):if nums[j]

> nums[down_index]

: self.swap(nums, down_index, j)

break

# 第三部,下降點之後的數都是遞減的,顛倒排序下降點之後的數

self.reverse(nums, down_index+1)

else

:# 如果沒有下降點,說明陣列是遞減的,全部顛倒排列

self.reverse(nums,0)

defswap

(self, nums, i, j)

: nums[i]

, nums[j]

= nums[j]

, nums[i]

# 這個是對陣列進行翻轉的標準方法

defreverse

(self, nums, start_position)

: i, j = start_position,

len(nums)-1

while i < j:

self.swap(nums, i, j)

i +=

1 j -=

1

leetcode 31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...

leetCode 31 下乙個排列

思路就是找到可以變大的最低位,進一步說,就是找到,nums pos 滿足,存在q使得,q pos 且 nums pos nums q 同時要注意的是,最終的答案要取q的下界。這是因為要找剛剛好比所給數字大的數字,所以我們要使得pos位,增大的盡量小。class solution else if nu...

LeetCode31 下乙個排列

實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列 即公升序排列 必須原地修改,只允許使用額外常數空間。以下是一些例子,輸入位於左側列,其相應輸出位於右側列。1,2,3 1,3,2 3,2,1 1,2,3 1...