下一個排列(LeetCode)

你喜歡梅西嗎發表於2020-11-10

題目連結

題目描述

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

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

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

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

思路

我們需要將一個左邊的較小數與一個右邊的較大數交換,以能夠讓當前排列變大,從而得到下一個排列。

同時我們要讓這個較小數儘量靠右,而較大數儘可能小。當交換完成後,較大數右邊的數需要按照升序重新排列。這樣可以在保證新排列大於原來排列的情況下,使變大的幅度儘可能小。

程式碼如下:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int len=nums.size(),flag=0;
        for(int i=len-1;i>=0;i--){
            for(int j=len-1;j>i;j--){
            	//找到可以交換的
                if(nums[i]<nums[j]){
                    swap(nums[i],nums[j]);
                    //較大數右邊的數按照升序重新排列
                    sort(nums.begin()+i+1,nums.end());
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        if(flag)
            return;
        //不存在更大排列,返回最小排列
        sort(nums.begin(),nums.end());
        return;
    }
};

相關文章