实现“下一个排列”函数,将排列中的数字重新排列成字典序中的下一个更大的排列。
如果这样的重新排列是不可能的,它必须重新排列为可能的最低顺序(即升序排序)。
重排必须在原地,不分配额外的内存。
以下是一些示例,左侧是输入,右侧是输出:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
网上看来一个示例,觉得挺好的,也没必要另外找一个了。
6 5 4 8 7 5 1
一开始没看对方的后面介绍,就自己在想这个排列的下一个排列是怎样的。
首先肯定从后面开始看,1和5调换了没有用。
7、5和1调换了也没有效果,因此而发现了8、7、5、1是递减的。
如果想要找到下一个排列,找到递增的位置是关键。
因为在这里才可以使其增长得更大。
于是找到了4,显而易见4过了是5而不是8或者7更不是1。
因此就需要找出比4大但在这些大数里面最小的值,并将其两者调换。
那么整个排列就成了:6 5 5 8 7 4 1
然而最后一步将后面的8 7 4 1做一个递增
class Solution {
void nextPermutation(vector<int>& nums) {
int k = -1;
for (int i = nums.size() - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
k = i;
break;
}
}
if (k == -1) {
reverse(nums.begin(), nums.end());
return;
}
int l = -1;
for (int i = nums.size() - 1; i > k; i--) {
if (nums[i] > nums[k]) {
l = i;
break;
}
}
swap(nums[k], nums[l]);
reverse(nums.begin() + k + 1, nums.end());
}
};