您的位置:首页 > 编程语言 > C语言/C++

[C++] LeetCode 31. 下一个排列

2018-03-31 12:54 555 查看

题目

实现获取下一个排列函数,这个算法需要将数字重新排列成字典序中数字更大的排列。

如果不存在更大的排列,则重新将数字排列成最小的排列(即升序排列)。

修改必须是原地的,不开辟额外的内存空间。

这是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1


解析

获取下一个全排列,如果想偷懒可以直接用函数
next_permutation


代码如下:

class Solution {
public:
void nextPermutation(vector<int>& nums) {
next_permutation(nums.begin(),nums.end());
}
};


从后往前遍历数组,找到当前节点右侧第一个比当前节点大的数,交换他们,然后使当前右侧有序即可。

假设数组
nums
长度为n(从0开始编号),数组中
nums[i]
到第
nums[n-1]
逆序(降序排列),且
nums[i-1]<nums[i]
,则下一个全排列时只需要考虑
nums[i-1]到nums[n-1]
即可,在
i-1
右侧找到第一个大于
nums[i-1]
的数,交换他们顺序,则后面升序排列就是最小的数,即下一个全排列

代码

class Solution {
public:
void nextPermutation(vector<int>& nums) {
int len=nums.size();
for(int i=len-1;i>=0;i--){
for(int j=len-1;j>i;j--){
if(nums[i]<nums[j]){
swap(nums[i],nums[j]);
sort(nums.begin()+i+1,nums.end());
return ;
}
}
}
reverse(nums.begin(),nums.end());
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: