问题
Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers.
If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).
The replacement must be in-place, do not allocate extra memory.
例子
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
分析
专题:Permutation
Next Permutation即下一个排列。假设当前的排列为a,如果a的Next Permutation为b,则b是a的字典序的下一个排列。例如a=1234,则a的下一个排列b=1243。
求下一个字典序排列有一个经典的算法:
假设nums[0..n]是当前的排列数组
- 找到满足nums[p] < nums[p + 1]的最大的p。如果p不存在,则说明当前排序是增序排列,下一个排列就是减序排列,把nums数组逆序即可。例如321的下一个排列就是123;如果k存在,进入步骤2;
- 找到满足nums[p] < nums[q]的最大的q;
- 交换nums[p]和nums[q];
- 把尾序列nums[k + 1 : n]逆序。
要点
了解Next Permutation的经典算法。
时间复杂度
O(n)
空间复杂度
O(1)
代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if (nums.size() < 2) return;
int p, q;
for (p = nums.size() - 2; p >= 0; p--)
if (nums[p] < nums[p + 1]) break;
if (p == -1)
{
reverse(nums.begin(), nums.end());
return;
}
for (q = nums.size() - 1; q > p; q--)
if (nums[q] > nums[p]) break;
swap(nums[p], nums[q]);
reverse(nums.begin() + p + 1, nums.end());
}
};