Leetcode典型题解答和分析、归纳和汇总——T31(下一个排列)

问题描述:

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

题目解析:

本题目的意思是给定一个整数,找到下一个比它大的整数。如3659 , 下一个比它要大的数是3695。这就是下一个排列的含义。

具体算法步骤为:

【1】从后往前进行位置交换,这样会更容易找到下一个较大排列

【2】找到降序排列部分,然后将最小的大数与第一个非逆序排列的数进行交换;

【3】然后再将该逆序进行逆置,使其变成升序。

class Solution {
public:
	void nextPermutation(vector<int>& nums) {
		int i=0, j=nums.size()-1;
		for(i=nums.size()-1; i && nums[i-1]>=nums[i]; --i); //从逆序开始扫描
		if(i){
			for(j=nums.size()-1; i<j && nums[i-1]>=nums[j]; --j);
			swap(nums[i-1],nums[j]);  //交换两个元素
		}
		reverse(nums.begin()+(i-1==j?0:i),nums.end());  //进行逆序反转
	}
};
发布了56 篇原创文章 · 获赞 7 · 访问量 4482

猜你喜欢

转载自blog.csdn.net/weixin_44504987/article/details/104340160