力扣 31 下乙個排列

2022-09-22 05:48:07 字數 2850 閱讀 3883

下乙個排列

整數陣列的乙個 排列 就是將其所有成員以序列或線性順序排列。

例如,arr = [1,2,3] ,以下這些都可以視作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。

整數陣列的 下乙個排列 是指其整數的下乙個字典序更大的排列。更正式地,如果陣列的所有排列根據其字典順序從小到大排列在乙個容器中,那麼陣列的 下乙個排列 就是在這個有序容器中排在它後面的那個排列。如果不存在下乙個更大的排列,那麼這個陣列必須重排為字典序最小的排列(即,其元素按公升序排列)。

例如,arr = [1,2,3] 的下乙個排列是 [1,3,2] 。

類似地,arr = [2,3,1] 的下乙個排列是 [3,1,2] 。

而 arr = [3,2,1] 的下乙個排列是 [1,2,3] ,因為 [3,2,1] 不存在乙個字典序更大的排列。

給你乙個整數陣列 nums ,找出 nums 的下乙個排列。

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

示例 1:

輸入:nums = [1,2,3]

輸出:[1,3,2]

示例 2:

輸入:nums = [3,2,1]

輸出:[1,2,3]

示例 3:

輸入:nums = [1,1,5]

輸出:[1,5,1]

1 <= nums.length <= 100

0 <= nums[i] <= 100

首先我們列出1,2,3的字典序順序

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

如果從前往後遍歷,因為位置越前的元素對字典序的影響越大,所以我們從後往前遍歷,這樣才可以得到字典序更小的下乙個序列

1,2,3

1,3,2

2,1,3

2,3,1

3,1,2

3,2,1

注意加粗的地方,去掉3,2,1 下乙個序列是1,2,3的情況,接下來我們分類

1,2,3 and 3,1,2 and 2,1,3他們都是最後兩個互換得到下乙個序列

最後兩個互換的前提是2<31<21<3

也就是說我們需要從後往前找到前面的元素小於後面元素的情況,

令下標i=len-1 to 0作為外層迴圈,內層迴圈j=i-1 to 0

**如下

int i=nums.size()-1;

while(i>0)

}i--;

}

1,3,22,1,3

2,3,1

3,1,2

加粗的都是下乙個序列不僅交換元素,還進行了排序,操作順序如下

1,3,2 是先交換1,2 =>2,3,1 排序3,1 => 2,1,3

2,3,1 是先交換2,3 =>3,2,1 排序2,1 => 3,1,2

(這個操作順序我想了好久才想出來)

也就是說找到滿足nums[i]>nums[j]的下標i,j時,要先將元素互換,然後將從j+1到結尾的元素進行排序

這剛好也滿足了第一種情況,即1,2,3 交換2,3 =>1,3,2 排序3,2 =>1,3,2,所以寫**就不需要格外區分兩種情況

接下來新問題來了,如果**這樣寫就會有錯

int i=nums.size()-1;

while(i>0)

}i--;

}

報錯測試用例[4,2,0,2,3,2,0]會將[4,2,0,2,3,2,0]加粗元素交換,但是實際上[4,2,0,2,3,2,0]元素交換,

根據我們在選擇方向的時候所說,盡可能改動靠後的資料而不是靠前,顯然0在2的前面,

所以我們需要新增兩個記錄變數max_j 來記錄最大的j 和其對應的max_i 記錄此時對應的i,

在每次判斷nums[i]>nums[j]的時候進行比較,給max_i max_j選取合適的值,

然後再進行排序,因此交換與排序需要從迴圈提出來。

class solution 

if (i >= 0)

swap(nums[i], nums[j]);//交換

}reverse(nums.begin() + i + 1, nums.end());//後面的已經是倒序,所以不需要排序,直接翻轉}};

不需要中間變數交換 a b 的值

翻轉string和vector

reverse(str.begin(), str.end());

陣列

reverse(a, a+5);

1 2 3 4 5

to5 4 3 2 1

力扣 31 下乙個排列

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

力扣31 下乙個排列 加油加油

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

力扣刷題筆記 31 下乙個排列

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