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

Next Permutation

时间:2016-08-16 18:46:44      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:

原理简介:

1,从数组尾端开始遍历,找到第一个nums[i]<nums[i+1] ;此时,所有大于i的数组成的子数组是一个单调递减的序列。

2,要求下一个子序列,那么我们需要在1中得到的单调子数组中找到一个比nums[i]大的数字,并且要尽量小。这样才能保证是下一个子序列。由于子数组是单调递减的,那么我们从数组尾端开始找到第一个比nums[i]大的,那么这个数字就是满足我们要求的数字。将其与nums[i]交换。

3,交换之后,大于i组成的子数组仍然是递减的。所以我们只需要将该子数组求一下逆序即可。


代码:

class Solution {
public:

    void nextPermutation(vector<int>& nums) {
       int index=-1;
       for(int i=nums.size()-1;i>0;i--)
       {
           if(nums[i]>nums[i-1])
           {
              index = i-1;
              break;
           }

       }
       if(index<0)
       {
           reverse(nums.begin(),nums.end());
           return;
       }
       for(int i=nums.size()-1;i>index;i--)
       {
            if(nums[i]>nums[index])
            {
               swap(nums[i],nums[index]);
               break;
            }
       }
       reverse(nums.begin()+index+1,nums.end());
    }
};



Next Permutation

标签:

原文地址:http://blog.csdn.net/janestar/article/details/52223312

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