下乙個排列
整數陣列的乙個 排列 就是將其所有成員以序列或線性順序排列。
例如,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<3
1<2
1<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...