leetcode.31—Next Permutation

本题大意就是求下一个比原排列大的全排列。例如:1,2,3有6种排列方式(按从小到大的顺序){(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)}根据这个表,123的下一个全排列是132

1,2,3 → 1,3,2
3,2,1 → 1,2,3

1,1,5 → 1,5,1

本题思路就是从后往前找,直到找到一个元素b,比它的前一个元素要大(我们把它的前一个元素记a)。然后将a与a以后比a大的最小元素替换。替换后,从b以后的这个序列一定是一个降序序列,可以用反证法来证明(在此证明略),之后只需反向保存就可以。

另外别忘了题目中要求,如果不存在下一个全排列的情况:这时候说明此排列已经是最大排列,直接是一个降序序列,所以直接反向输出即可。

这里要用到STL的反转函数reverse:reverse
要知道的是它的参数是两个迭代器

详见AC代码:

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        bool flag=0;
        for(int i=nums.size()-1;i>0;i--){
            if(nums[i]>nums[i-1]){
                flag=1;
                int min=nums[i],path=i;
                for(int j=i;j<nums.size();j++){
                    if(nums[j]<=min&&nums[j]>nums[i-1]){
                        min=nums[j];
                        path=j;
                    }
                }
            swap(nums[i-1],nums[path]);
               // cout<<nums[i-1]<<endl;
               //for(int j=0;j<(nums.size()-i)/2;j++){
                reverse(nums.begin()+i,nums.end());  
                   // swap(nums[i+j],nums[nums.size()-1-j]);
                //}
                break;
            }
        }
        if(!flag){
                reverse(nums.begin(), nums.end());  
            }
    }
};

点赞