leetcode 31 下乙個排列

2021-09-29 07:39:32 字數 847 閱讀 1579

### 題目

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

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

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

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

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

### 思路

分析下,要找到下乙個更大的排序,有兩種情況:

第一種,此排列是最大的排列了,這樣直接對陣列進行公升序排序就可以了,輸出最小的排列。比如:3 2 1,這樣直接排序之後1,2,3

第二種,是中間的某個排列,比如1,2,3,5,4。它的下乙個排列應該是1,2,4,3,5。交換的規則如下,要找到下乙個更大的排列,原則上來說,需要將乙個大的數和前面的乙個小的數進行交換,這樣就形成了下乙個大的排列,例如1,2,3。交換之後變成1,3,2.所以第一步是找到原來排列當中的待交換的那個數,也就是從原來排列的最後一位往前比較,找到小於自身後面的數第乙個數,作為待交換的數,因為如果這個數是比後面的數大,那麼它往後交換一定是將這個排列變得更小,所以要找到比後面的數小的數作為待交換的數。然後再將待交換的數後面的排列進行公升序排序,最後再將待交換的數與後面排序好的序列中的第乙個大於自己的數進行交換,這樣就得到下乙個更大的排序。

### code

class solution

if(l==0)//如果l==0,說明是最大排序,直接返回排序結果。

else

{int temp=l-1;

sort(nums.begin()+l,nums.end());

for(int i=l;i

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...