#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
/*
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 example.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
The given example actually is not that clear.
Think about this one: 1, 3, 2 -> 2, 1, 3 the process is first locate "1" position. swap(1, 2) and reverse the following.
*/
vector<int> nextPermutation(vector<int> nums) {
int k = nums.size() - 2;
while(k >= 0 && nums[k] >= nums[k+1]) {
k--;
}
if(k == -1) {
return {};
}
for(int i = nums.size() - 1; i > k; --i) {
if(nums[i] > nums[k]) {
swap(nums[i], nums[k]);
break;
}
}
reverse(nums.begin() + k + 1, nums.end());
return nums;
}
int main(void) {
vector<int> nums{1, 3, 2};
vector<int> res = nextPermutation(nums);
for(int i = 0; i < res.size(); ++i) {
cout << res[i] << " ";
}
} 1,1 Top
LeetCode 31. Next Permutation
最新推荐文章于 2020-10-03 00:35:45 发布
本文介绍了一个C++函数nextPermutation,该函数接收一个整数向量并将其重新排列为字典序中下一个更大的排列。如果没有这样的排列,则将其变为最小的排列(升序)。此函数首先从后向前查找第一个破坏了升序的元素,然后找到右侧大于该元素的最小值并与之交换,最后反转剩余部分。

632

被折叠的 条评论
为什么被折叠?



