LeetCode中等 下乙個排列

2021-10-03 11:28:46 字數 1575 閱讀 8276

題目描述:實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。

如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。

必須原地修改,只允許使用額外常數空間。

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

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

思路:乍一看題目感覺挺複雜的,直接求下乙個排列好像一下子沒什麼思路。所以從最簡單的情況入手——數列只有兩個數。此時,若第乙個數大於第二個,則屬於不存在下乙個更大的排列的情況,直接輸出最小排列即可;反之,則應當互動這兩個數。事實上,對於任意的數列,只要最後兩個數是正序排列的,那麼交換最後兩個數即可。假設數列nums=。將numsmin(也就是最後的兩個數)作為最小數列,將numscurrent=稱為當前數列。則有以下流程:

(流程圖畫的有點粗糙。。。)

需要注意的是虛線框裡的部分,根據前面的條件,此時的numscurrent中am+1大於am且大於am+1後面的數。這樣其實可以分為三種情況繼續討論,這裡就不多贅述了。這三種情況對應的做法可以統一成一種做法,也就是虛線框裡寫的。多提一嘴,這種情況下,am+1及其後面的數字必然是降序排列的,在程式設計的時候利用這種特性可以更加高效。

public

void

nextpermutation

(int

nums)

} array.

reverse

(nums);}

}public

static

void

exchange

(ref

int[

] nums,

int a,

int b)

public

static

int[

]quick_sort

(ref

int[

] list,

int left,

int right)

return list;

}private

static

intget_partition

(ref

int[

] list,

int left,

int right)

list[left]

= list[right]

;while

(left < right && list[left]

<= tmp)

list[right]

= list[left];}

list[right]

= tmp;

return right;

}

**裡的quick_sort()函式是快排。實際上從大到小排列可以不用快排而是對目標數列進行反轉,不過懶得改了。。

LeetCode 31 下乙個排列 中等

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

Leetcode題目31 下乙個排列(中等)

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

LeetCode 下乙個排列

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