實現獲取下乙個排列的函式,演算法需要將給定數字序列重新排列成字典序中下乙個更大的排列。題目的意思是,找出排列數的下乙個比其大的數,若其為最大則其下乙個為最小。列如,將[1,2,3]三個數全排列有以下123,132,213,231,312,321,若當前為231,則下乙個為312,若當前為321,則下乙個為123,以此類推。如果不存在下乙個更大的排列,則將數字重新排列成最小的排列(即公升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
對於這中題目,我們可以先設定一組資料進行測試,找出其中的規律。
假設一組資料為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...