題目:
31. 下乙個排列
31. 下乙個排列
實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須 原地 修改,只允許使用額外常數空間。
示例 1:
輸入:nums = [1,2,3]
輸出:[1,3,2]
示例 2:
輸入:nums = [3,2,1]
輸出:[1,2,3]
示例 3:
輸入:nums = [1,1,5]
輸出:[1,5,1]
示例 4:
輸入:nums = [1]
輸出:[1]
思路
初一看發現可能沒看懂,這個就是找全排列中已知排列的下乙個排列
那麼我們回顧一下全排列
題目:
給定乙個 沒有重複 數字的序列,返回其所有可能的全排列。
示例:輸入: [1,2,3]
輸出:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]思路:
使用深度優先遍歷,需要注意的是 index這個引數 只不過是統計符合條件的集合數目,並不代表nums中的元素索引下標,我覺得將index改為count這樣的變數名更容易理解。(因為我寫dfs時,習慣用index表示深度)
**:
class
solution
for(
int i=
0;isize()
;i++)}
public
: vector
int>>
permute
(vector<
int>
& nums)
};
nums[1,2,3]通過**形成的樹狀圖是
通過樹狀圖我們知道
【1,2,3】的下乙個排列是【1,3,2】
【2,3,1】的下乙個排列是 【3,1,2】
【3,2,1】的下乙個排列是【1,2,3】
注意: 【3,2,1】的下乙個排列是【1,2,3】(當作特殊化進行處理)
31. 下乙個排列
題目:
實現獲取 下乙個排列 的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須 原地 修改,只允許使用額外常數空間。
思路
通過針對全排列的樹狀圖的分析,我們可以得出,例如1 4 3 2 0 的下乙個排列是 2 0 1 3 4 其實我們從後往前找,找到乙個的不滿足的nums[i]<=num[i+1] 的i ( i位置越界,需要將整個nums反轉後直接返回),我們可以發現 i的位置在 index=0,也就是說i後面的元素是單調不嚴格遞減的【4,3,2,0】。 我們需要明白 此時[i+1,nums.size()-1] 位置中,我們從nums.size()-1==》i+1位置 找到乙個比i位置元素nums[i] 大的元素的位置j
顯然這個位置的元素是 2 index=3; 然後交換兩個元素的值,swap(nums[i],nums[j]) 然後從小到大排序i+1到nums.size()-1的元素的值
我們注意尋找left時,我用了兩種方法,應該都需要掌握
int i=nums.
size()
-1;while
(i>=
1&&nums[i-1]
>=nums[i])if
(i<1)
int left=i-
1;
或者
int i=nums.
size()
-2;while
(i>=
0&&nums[i]
>=nums[i+1]
)if(i<0)
int left=i;
**:
class
solution
// if(i<1)
// // int left=i-1;
int i=nums.
size()
-2;while
(i>=
0&&nums[i]
>=nums[i+1]
)if(i<0)
int left=i;
int j=nums.
size()
-1;while
(left
>=nums[j]
)int right=j;
//肯定存在j,你放心
swap
(nums[left]
,nums[right]);
sort
(nums.
begin()
+left+
1,nums.
end())
;//注意交換後 是i+1,nums.size()-1 進行排序(less<>())}}
;
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...