題目
實現獲取下一個排列的函數,算法需要將給定數字序列重新排列成字典序中下一個更大的排列。
如果不存在下一個更大的排列,則將數字重新排列成最小的排列(即升序排列)。
必須原地修改,只允許使用額外常數空間。
以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
思路
25431
後面爲完全逆序,這時找到第一個正序2
從後往前找第一個比2大的數字,是3,交換2,3
35421
這時逆置3後面的數字即可
31245
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n = nums.size();
if(n < 2) return;
int idx = n-2;
// 找到第一個非逆序的位置
while(idx >= 0 && nums[idx] >= nums[idx+1]) idx--;
// 完全逆序,則爲最大字典序,reverse一下變成最小
if(idx < 0){
reverse(nums.begin(),nums.end());
}else{
// 否則,從後向前找到第一個大於當前位置的數字,swap後
// 將後面逆序的位置,變成正序即可
int j = n-1;
while(nums[j] <= nums[idx]) j--;
swap(nums[idx],nums[j]);
reverse(nums.begin()+idx+1,nums.end());
}
}
};