31.下一个排列

Posted IT嘟嘟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了31.下一个排列相关的知识,希望对你有一定的参考价值。

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

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

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

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

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.下一个排列的主要内容,如果未能解决你的问题,请参考以下文章

leetcode-----31. 下一个排列

LeetCode 31 Next Permutation(下一个全排列)

Leecode31. 下一个排列——Leecode大厂热题100道系列

Leecode31. 下一个排列——Leecode大厂热题100道系列

LeetCode:下一个排列31

p124 数组的下一个排列(leetcode 31)