leetcode31 下乙個排列(c )

2021-09-22 13:01:21 字數 1082 閱讀 9478

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

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

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

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

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

題目的意思是,找出排列數的下乙個比其大的數,若其為最大則其下乙個為最小。列如,將[1,2,3]三個數全排列有以下123,132,213,231,312,321,若當前為231,則下乙個為312,若當前為321,則下乙個為123,以此類推。

對於這中題目,我們可以先設定一組資料進行測試,找出其中的規律。

假設一組資料為1376542,則其下乙個為1423567,怎麼得來的呢。

可以看到數字從後往前看都是依次增大,直到3位置才減少,然後在從後面往前找到乙個比3大的數,交換這兩個數,最後將3後面的數倒置,就能得到下乙個的值。

137 6 5 4 2

147 6 532

1 42 3 5 6 7

可以按照上述思路編寫**,陣列問題考慮使用雙指標,乙個定義為最後乙個的下標,記為j(用來第二次從後往前找),最後乙個定義為倒數第二個的下標,記為i(用來第一次找到減少的值)。第一次從後往前迭代找到第乙個減少的數,即nums[i]。然後在從後面往前迭代找到比第乙個減少的位置的數大的數,即nums[j],交換這兩個數,然後將i後面的值都進行倒置,即為結果。

class solution 

for (int k = i + 1; k < (nums.size()+i+1) / 2; k++)//倒置,及找到中心點將兩邊交換,亦可使用下面標準庫函式

swap(nums[k], nums[nums.size()+i - k]);

//reverse(nums.begin()+i+1,nums.end());

}};

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