码迷,mamicode.com
首页 > 其他好文 > 详细

31.下一个排列

时间:2021-06-06 19:38:42      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:结果   一个   i++   on()   class   name   pac   排序   渐变   

实现下一个排列,它将数字重新排列成按字典顺序排列的下一个更大的数字排列。

如果这样的排列是不可能的,它必须重新排列它作为最低可能的顺序(即,按升序排序)。

替换必须到位,并且只使用恒定的额外内存。

这里有一些例子。输入列在左边,相应的输出列在右边。

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

/*
解题思路:
这道题让我们求下一个排列顺序,由题目中给的例子可以看出来,
如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况,
再来看下面一个例子,有如下的一个数组
1  2  7  4  3  1
下一个排列为:
1  3  1  2  4  7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,
数字逐渐变大,到了2时才减小的,然后再从后往前找第一个比2大的数字,
是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1  2  7  4  3  1
1  2  7  4  3  1
1  3  7  4  2  1
1  3  1  2  4  7
*/
#include<iostream>
using namespace std;
#include<vector>
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(), num.end());
	}
};

int main()
{
	int a[100];
	int x;
	int i = 0;
	vector<int>vec;
	while (cin >> a[i])
	{
		vec.push_back(a[i]);
		i++;//注意这里i++对输出结果的影响
		x = cin.get();
		if (x == ‘\n‘)
			break;
	}

	Solution().nextPermutation(vec);
	for (int i = 0; i < vec.size(); i++)
	{
		cout << vec[i] << " ";
	}
	system("pause");
	return 0;
}

  

31.下一个排列

标签:结果   一个   i++   on()   class   name   pac   排序   渐变   

原文地址:https://www.cnblogs.com/277223178dudu/p/14645865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!