leetcode之Next Permutation

原题如下:

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.

If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

The replacement must be in-place, do not allocate extra memory.

Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

首先,在C++的STL中提供了next_permutation()方法,这样只需调用这个方法即可,可见熟悉STL的重要性。

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

在竞赛中这样写肯定是没问题的,但在平时刷题时还是要了解的更加透彻一些,因为此题就是对next_permutation()实现方法的考察。具体的实现思路是,首先从后往前找到第一个增序的二元组,该二元组中第一个元素即是要做出改变的元素的位置,标记为i - 1,然后在i - 1之后的元素中从后往前找到第一个比i - 1处的元素大的元素,交换两个元素值,接下来只需对交换后的i - 1之后的元素进行逆序操作即可。在实现中,针对已经是最大序列的这种特殊情况,直接进行逆序即可。

 void nextPermutation(vector<int> &num) {
		
		if(num.empty() || num.size() == 1)
			return;
		int i = num.size() - 1;
		for(i = num.size() - 1; i> 0; i--){
		    if(num[i] > num[i - 1])
				break;
		}
		if(i == 0){    //已经是最大的序列了
			reverse(num.begin(),num.end());
			return;
		}
		int j = num.size() - 1;
		for(j = num.size() - 1; j >= i; j--){
			if(num[j] > num[i - 1]){
			    break;
			}
		}
		int temp = num[i - 1];
		num[i - 1] = num[j];
		num[j] = temp;
		vector<int>::iterator it = num.begin() + i;
		reverse(it,num.end());
		return;
    }
这道题单纯的思考比较困难,但动手画出来之后还是比较容易理解的,所以既要动脑,也要动手才行啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值