设为首页 加入收藏

TOP

leetcode:Next Permutation
2015-07-20 17:23:51 来源: 作者: 【 】 浏览:2
Tags:leetcode: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
  
    &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
  
    &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; 
    }
};

  


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu-1325 & poj-1308 Is It A.. 下一篇HDU 4704 Sum (隔板原理 + 费马小..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Python 数据分析与可 (2025-12-26 21:51:20)
·从零开始学Python之 (2025-12-26 21:51:17)
·超长干货:Python实 (2025-12-26 21:51:14)
·为什么 Java 社区至 (2025-12-26 21:19:10)
·Java多线程阻塞队列 (2025-12-26 21:19:07)