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; }