leetcode31下乙個排列

2021-10-05 00:27:30 字數 1346 閱讀 9326

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

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

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

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

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