码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 31. Next Permutation

时间:2018-11-03 11:23:32      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:public   i+1   amp   for   时间复杂度   reverse   eve   swa   ret   

很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

标签:public   i+1   amp   for   时间复杂度   reverse   eve   swa   ret   

原文地址:https://www.cnblogs.com/hankunyan/p/9899863.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!