LeetCode 31 C++ 下一个排列

【1  3  5  4  2】   ---> 【1  4  5  3  2 】 ---> 【1  4  2  3  5 】

综合以上,找某序列的下一个排列算法为:

1、找到右边“”最长“”的降序子序列,如【5,4,2】,此时pos定位到“3”的位置

2、从右到左遍历降序子序列【5,4,2】,找到第一个大于3的元素,并交换(如上图红色值)

3、将第二步得到的子序列翻转即可得到下一个排列;

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
	void nextPermutation(vector<int> &num) {
		int i, j, n = num.size();
		for ( i = n - 2; i >= 0; i--){
			if (num[i + 1] > num[i]){
				for (j = n - 1; j >= i; j--){
					if (num[j] > num[i]) break;
				}
				swap(num[i],num[j]);
				reverse(num.begin() + i + 1,num.end());
				return;
			}
		}
		reverse(num.begin() + i + 1, num.end());
	}
};
int main(){
	vector<int> num = { 1, 2, 7, 4, 3, 1 };
	Solution s;
	s.nextPermutation(num);
	for (int i = 0; i < num.size(); i++){
		cout << num[i]<<" ";
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值