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

leetcode:Next Permutation

时间:2015-01-25 01:26:02      阅读:208      评论:0      收藏:0      [点我收藏+]

标签:leetcode   reverse   next_permutation   

一、     题目

     这道题给出一个数列,求大于这个数列的最小数列。

例如:

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

二、     分析

喜欢使用C++的童鞋或许会马上想到next_permutation()这个库函数,没错,其实这道题就是实现的它(严格说来只是初步实现),如果可以的话,如果直接输入这一行代码就可通过:

 

void nextPermutation(vector<int> &num) {
       next_permutation( num.begin(), num.end() );
}

但是,可不是说我们就这样结束了,当然不能,我们要自己实现它。观察数列会发现,如果数列是递减的话我们是找不出比他更大的数列的,所以我们要找到两个递增元素,即从右到左找到第一个左边小于右边的元素,然后我们再找出该元素右边比他大的最小的元素,交换两数,然后再将该数后面的数列reverse()即可。

分为四步:

1、         从右到左找到第一个左边小于右边的元素num[i];

2、         从右到左找到第一个大于num[i]的元素num[j]

3、         交换num[i]和num[j];

4、         将num[i]后的数列reverse()

代码如下:

 

class Solution {
public:
    void nextPermutation(vector<int> &num) {
        int len = num.size()-1;
        int count = len-2;
        int i,j;
        for(i=len-1; i>=0; i--){
        	if(num[i+1]>num[i]){
        		for(j=len; j>i-1; j--){
        			if(num[j]>num[i])
        				break;
        		}
        		swap(num[i],num[j]);
        		reverse(num.begin()+i+1,num.end());
        		return;
        	}
        }
        reverse(num.begin(),num.end());
        return;
    }
    
    void swap(int &a, int &b){
    	a = a + b;
		b = a - b;
		a = a - b; 
    }
};


leetcode:Next Permutation

标签:leetcode   reverse   next_permutation   

原文地址:http://blog.csdn.net/zzucsliang/article/details/43100145

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