LeetCode 31. Next Permutation

Posted 約束の空

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 31. Next Permutation相关的知识,希望对你有一定的参考价值。

很tricky的一道题,想通之后不难。

一个数组,从后往前找,找到第一个 nums[i]<nums[i+1] 的下标,因此下标 i+1 ~ n-1 的数组元素都是递减的,这一串序列已经是最大的了,找不到next permutation,因此我们必须找到 i ~ n-1 这一串序列的next permutation。

这也很容易,我们只要在后面找到第一个大于 nums[i] 的元素,与 nums[i] 交换(这样这一位一定是最小的了),然后把 i+1 ~ n-1 的序列 reverse 一下就好了。

当然找第一个大于 nums[i] 的元素可以用二分优化,但是无论如何,总体的时间复杂度都是 O(n)。

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int i, j;
        for (i=nums.size()-2;i>=0;--i){
            if (nums[i]<nums[i+1]) break;
        }
        if (i==-1){ // all in descending order
            reverse(nums.begin(),nums.end());
            return;
        }
        for (j=nums.size()-1;j>=i+1;--j){
            if (nums[j]>nums[i]) break;
        }
        swap(nums[i],nums[j]);
        reverse(nums.begin()+i+1,nums.end());
    }
};

 

以上是关于LeetCode 31. Next Permutation的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode OJ 31. Next Permutation

[array] leetcode - 31. Next Permutation - Medium

[LeetCode] 31. Next Permutation ☆☆☆

Leetcode 31. Next Permutation

LeetCode-31-Next Permutation

[Leetcode]31. Next Permutation