31. Next Permutation

来源:互联网 发布:爱知产业大学 推荐入学 编辑:程序博客网 时间:2024/06/06 23:21

1、题目描述

给出一个数组表示一种排列,根据字典序,返回它的下一个更大的排列。


2、思路

1、先从尾往头找到数组中的一个特殊位置,其特点为该位置的前一个数字小于当前数字。该位置index为i。

2、若i==0,则说明输入已经是最大排列了,所以将数字reverse,返回其最小排列作为答案。

3、设lowid = i - 1; 从i开始往后,找到一个位置highid,highid所在位置的数字大于lowid的数,而highid+1的数小于或等于lowid的数。

4、交换 nums[highid] 与 nums[lowid],这样等于说把一个稍大的数换到前面去了,后面的数字从第i位开始依旧是递减的。

5、将第i位到数组最后一位逆序,变成升序。


3、代码

void nextPermutation(vector<int>& nums) {        int n = nums.size();        int i=n-1;        for(;i>=1;i--){            if(nums[i]>nums[i-1])                break;        }        if(i==0){            reverse(nums.begin(),nums.end());            return;        }        int lowid = i-1;        int j=i;        for(;j<n;j++){            if(nums[j]<=nums[lowid])                break;        }        int highid=j-1;        swap(nums[lowid],nums[highid]);        for(int a = i,b=n-1;a<b;a++,b--){            swap(nums[a],nums[b]);        }    }