leetcode31 字典序下一個排列(mid)

題目

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

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

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

以下是一些例子,輸入位於左側列,其相應輸出位於右側列。
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());
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章