题目描述
实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须 原地 修改,只允许使用额外常数空间。
比如:
输入:nums = [1,2,3]
输出:[1,3,2]
解法
把所有数字看成一个整数,将所有数字全部排列,找出该整数的下一个数字排列。
比如:13456这几个数字,所有排列成的整数有:
13456
13465
13546
…
65431
找出13465的下一个整数,也就是13546。需要找到一个‘小数’,将其与后面的较小的‘大数’交换,再将’小数‘后的所有数进行升序排列
思路:
1)从右往左找升序的(i,j),使nums[i]<nums[j],则[j,end)都是降序
2)从{
[j,end)中从后往前找一个a,使得nums[i]<nums[a],将nums[i]与nums[a]交换,然后将[j,end)的数字进行升序排列,就找到了下一个大的排列了。
代码:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=nums.size()-2,j=nums.size()-1;
while(i>=0&&nums[i]>=nums[j]){
i--;
j--;
}
if(i>=0){
int a=nums.size()-1;
while(nums[i]>=nums[a]){
a--;
}
swap(nums[i],nums[a]);
}
reverse(nums.begin()+j,nums.end());
}
};