题目描述
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地
修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
来源,leetcode 每日一题 31. 下一个排列
解题思路
从右边往左,找到第一个下降的数字,然后从右边中找到比它大且最接近它的数字,进行替换,然后将其右侧按照升序排列即可。
代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int flag = 0;
int last = nums[nums.size() - 1];
vector<int>:: iterator it;
for (it = nums.end() - 1; it >= nums.begin(); it--) {
if (*it >= last) {
last = *it;
} else {
for (vector<int>:: iterator it2 = nums.end() - 1; it2 != it; it2--) {
if (*it2 > *it) {
int temp = *it2;
*it2 = *it;
*it = temp;
break;
}
}
break;
}
}
it++;
sort(it, nums.end());
}
};