LeetCode之Next Permutation

/*这道题目是一道找规律的问题:
1.从最末尾寻找一对相邻的元素,满足num[i]<num[i+1];
2.如果找到这样的一对相邻元素,再从末尾开始找一个元素num[j],
满足num[j]>num[i];如果没有找到这样的相邻元素,转4;
3.交换num[i]和num[j],然后颠倒从i+1一直到末尾的元素;
4.表示当前序列已经是最大的,直接翻转整个序列即可。
方法参考自:https://github.com/soulmachine/leetcode*/
class Solution {
public:
	void nextPermutation(vector<int> &num) {
		if(num.size() < 2) return;
		int i(num.size() - 2);
		while(i >= 0){
			if(num[i] < num[i+1]){
				int j(num.size() - 1);
				while(num[j] <= num[i]) --j;
				swap(num[i], num[j]);
				reverse(num.begin()+i+1, num.end());
				return;
			}
			--i;
		}
		reverse(num.begin(), num.end());
		return;
	}
};

/*如果单纯为了AC这道题,直接用STL中的next_permutation()函数即可*/
class Solution {
public:
	void nextPermutation(vector<int> &num) {
	    next_permutation(num.begin(), num.end());
	}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值