31. Next Permutation

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.html

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).算法

The replacement must be in-place, do not allocate extra memory.數組

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1spa

下一個排列問題,依稀記得STL中有一個next_permutation()算法,能夠實現本功能。固然,本題要求讀者手動實現,其實難度不小,可是若是想通了就很簡單。code

首排列是完全的順序,尾排列是完全的逆序。假設前一個排列是P,後一個排列是Q。那麼會有P和Q的相同前綴的長度儘量的長。htm

對於一個數組1,2,5,4,3,1,它的下一個排列是1,3,1,2,4,5blog

所以,咱們能夠總結出以下規律:排序

從後往前看,數字應當是逐漸增大的,如上例中,增大的趨勢直到2才中止,這時應當從後往前尋找第一個比2大的數也就是3。交換2和3之後,顯然,該位置之後的數是逆序排序,爲了使這部分的數儘量的小,所以要逆轉這部分數組。get

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

 LeetCode彙總it

相關文章
相關標籤/搜索