标签:结果 一个 i++ on() class name pac 排序 渐变
实现下一个排列,它将数字重新排列成按字典顺序排列的下一个更大的数字排列。
如果这样的排列是不可能的,它必须重新排列它作为最低可能的顺序(即,按升序排序)。
替换必须到位,并且只使用恒定的额外内存。
这里有一些例子。输入列在左边,相应的输出列在右边。
1,2,3 → 1,3,23,2,1 → 1,2,31,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;
}
标签:结果 一个 i++ on() class name pac 排序 渐变
原文地址:https://www.cnblogs.com/277223178dudu/p/14645865.html