文章目录
leetcode31:31. 下一个排列
题目描述
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
Example
输入:1,1,5
输出:1,5,1
solution idea
一遍扫描
- 从末尾寻找最长的降序排列。从右边找到第一对两个连续的数字
a[i]
和a[i-1]
,满足a[i]
>a[i-1]
。 - 将数字
a[i-1]
替换为位于其右侧区域的数字中比它更大的数字,例如a[j]
,交换数字a[i-1]
和a[j]
。 - 放置那些按升序排列的数字,以获得最小的排列。反转
a[i-1]
之后的数字,以获得下一个最小的字典排列。
class Solution {
public:
void swap(vector<int>& nums, int i,int j) // 交换i,j索引的数值
{
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
void reverse(vector<int>& nums, int start) //从 start 位置开始反转数组
{
int i=start,j=nums.size()-1;
while(i<j)
{
swap(nums,i,j);
i++;
j--;
}
}
void nextPermutation(vector<int>& nums) {
int length=nums.size();
int i=length-2;
while(i>=0 && nums[i]>=nums[i+1]) i--;
if (i>=0)
{
int j=length-1;
while(j>=0 && nums[i] >=nums[j]) j--;
swap(nums,i,j);
}
reverse(nums,i+1);
}
};
参考文献
- c++ prime 第5版