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

下一个排列

时间:2015-08-30 11:23:27      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:c++   代码   

        该题的思路是从后向前扫描数组,找到第一对位置 i,j (i < j) 使得 i 位置的值小于 j 位置的值,交换 i 位置和 j 位置的元素值,然后对 i 位置之后的元素进行排序即可。代码如下:

 vector<int> nextPermutation(vector<int> &nums) {
        // write your code here
        int size = nums.size();
        
//标记数组是否为递减数组
        bool flag = false;

//找出从后向前第一个不递增的元素        
        int i = size - 1;
        for(; i > 0; i--){
            if(nums[i - 1] < nums[i]){
                flag = true;
                break;
            }
        }
        
//若数组为递减数组,则下一个全排列直接反转数组即可        
        if(flag == false){
            sort(nums.begin(), nums.end());
            return nums;
        }

//找到第一个比反转元素大的元素        
        int k = size - 1;
        while(nums[k] <= nums[i - 1])
            k--;

//交换元素        
        int tmp = nums[i - 1];
        nums[i - 1] = nums[k];
        nums[k] = tmp;

//排序剩余元素        
        sort(nums.begin() + i, nums.end());
        return nums;
    }

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

下一个排列

标签:c++   代码   

原文地址:http://blog.csdn.net/ny_mg/article/details/48102767

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