leetcode 31

刚开始的时候,没怎么理解题意,不知道具体是要干什么。
后来仔细想了下,是这么回事:
给定一个数组,比如1,7,2,4,1
我们不妨把它看作数字 17241,题目要求寻找下一个更大的排列,在数字的角度来看,我们的任务就是重新排列它,找到比17241更大的数字中 最小的那一个,也就是 17412,那么如何来操作呢?
我们设想这样一个排列:6,5,4,3,2,1; 很显然,没有比它更大的了,也即从左到右降序的排列,是不需要动的。
现在修改一下,给定:3,2,6,5,4,3,2,1;很显然,后面的 “部分降序片段 654321” 是暂时不需要动的;
我们要做的是找到6左边的2,让它和6后面的3交换,变为:
3,3,6,5,4,2,2,1
再将6到最后的部分,排序:
3,3,1,2,2,4,5,6 这就是最后的结果;
归纳来讲:从后往前,i 的移动 找第一个不按降序排列的数字。确定了 i 的位置,从后往前,找第一个比 i位置 大的数, 将它和 i位置 交换。最后,把 i 到最后的部分,变为升序。

代码:

class Solution {
public:
	void nextPermutation(vector<int>& nums) 
	{
		int i = nums.size() - 1;
		int j,temp;
		if (i == 0 || i == -1)  //如果空数组 或者就一个数
			return;
		while (i&&nums[i - 1] >= nums[i])
			i--;   //寻找不按降序的第一个数
		if (!i)  //如果这个数组是完全降序的
		{
			sort(nums.begin(), nums.end());
			return;
		}
		if (i == nums.size() - 1)   //如果i根本没动
		{
			temp = nums[i];
			nums[i] = nums[i - 1];
			nums[i - 1] = temp;
		}
		for ( j = nums.size() - 1; j > i; j--)   //寻找大于nums【i-1】的位置
		if (nums[j] > nums[i - 1])
			{
				temp = nums[j];
				nums[j] = nums[i-1];
				nums[i-1] = temp;
				break;
			}
		for (i, j = nums.size() - 1; i <= j; i++, j--)  //后面的部分 变为升序
		{
			temp = nums[j];
			nums[j] = nums[i];
			nums[i] = temp;
		}
		return;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值