【Leetcode】【Next Permutation】【下一个排列】【C++】
- 题目:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
- 思路:(以1、2、3、4、5为例)
1 2 3 4 5
1 2 3 5 4
1 2 4 3 5
1 2 4 5 3
1 2 5 3 4
1 2 5 4 3
1 3 2 4 5
……
【1 3 5 4 2】 =》 【1 4 5 3 2 】 =》 【1 4 2 3 5 】
综合以上,找某序列的下一个排列算法为:
1、找到右边“”最长“”的降序子序列,如【5,4,2】,此时pos定位到“3”的位置
2、从右到左遍历降序子序列【5,4,2】,找到第一个大于3的元素,并交换(如上图红色值)
3、将第二步得到的子序列翻转即可得到下一个排列;
- 代码:
class Solution { public: void nextPermutation(vector<int>& nums) { int len=nums.size(); int pos=-1; for(int i=len-1; i>0; i--) { if(nums[i]>nums[i-1]) { pos=i-1; break; } } if(pos==-1) { reverse(nums.begin(),nums.end()); return; } for(int i=len-1; i>pos;i--) { if(nums[i]>nums[pos]) { int temp=nums[pos]; nums[pos]=nums[i]; nums[i]=temp; break; } } reverse(nums.begin()+pos+1, nums.end()); return ; } };
- prevPermutation算法:
将以上步骤逆过来即可,如求【1 4 2 3 5 】的前一个排列:
【1 4 2 3 5 】 =》 【1 3 2 4 5 】 =》【1 3 5 4 2】
- 找最长升序子序列,如图【2,3,5】
- 交换4 和 3 (具体原因见nextPermutation)
- 颠倒交换后的子序列
转载请注明出处及链接 谢谢