1. 程式人生 > >Leetcode 31. 下一個排列

Leetcode 31. 下一個排列

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

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

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

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

看了網上的題解才懂得。。。現在再來梳理一下。。。

(1)找出nums[i]<nums[i-1]的情況。。。即找出第一個不符合降序排序的情況。。。

(2)從末尾元素開始查詢,找滿足第一個比nums[i]大的最小元素nums[j]。。。因為i後面都是降序排列的,所以直接從後面遍歷即可。。。

(3)交換nums[j]與nums[i],並將i+1後面的元素進行反轉。。。。

(4)若原序列符合降序排序的情況,則直接反轉序列。。。

程式碼如下:
 

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int Size=nums.size();
        if(Size==1)
            return;
        for (int i=Size-2,j=Size-1;i>=0;i--,j--)
        {
            if(nums[i]<nums[j])
            {
                int k=Size-1;
                while (nums[i]>=nums[k])
                    k--;
                swap(nums[i],nums[k]);
                reverse (nums.begin()+j,nums.end());
                return;
            }
        }
        sort(nums.begin(),nums.end());
    }
};