實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。
如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
下面的解題思路中統一以[1,3,2,4,3,2,1]舉例。
首先,我們從後往前遍歷陣列,找到第乙個降序的位置(因為該位置處是降序,因此可以從該位置的後續位置中找乙個大於該位置的值,使得陣列變大), 上述例子中,在index=2位置處於降序(4–>2為降序)。
已知index=2處是降序,那麼index+1~length-1的元素是從後往前公升序排列的,且至少有乙個元素大於index位置的元素(因為index位置是降序位置,所以至少index+1位置的值大於index位置的值)。
我們從後往前遍歷,找到第乙個大於index位置的值,將其與index位置的值進行交換,上述例子中陣列變為[1,3,3,4,2,2,1](加粗的數字表示交換過的)。
交換完畢後,在index+1~length-1位置同樣不改變從後往前的公升序規律(因為我們之前照的是第乙個大於index位置的值進行的交換,所以交換過來後,左邊都是大於該元素的,右邊都是小於該元素的)。然後我們翻轉index+1 ~length-1位置的元素,最終結果就是我們要找的下乙個序列(翻轉後,上述陣列變為[1,3,3,1,2,2,4],加粗部分被翻轉)。
class
solution
//從後往前找到第乙個大於nums[left]的位置
for(
; right > left;
--right)
//交換兩個位置的元素
int tmp = nums[left]
; nums[left]
= nums[right]
; nums[right]
= tmp;
//翻轉left + 1 ~ length - 1位置的值
reverse
(nums, left +
1, nums.
size()
-1);
return;}
void
reverse
(vector<
int>
& nums,
int left,
int right)
return;}
};
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...