leetcode之路031 Next Permutation

来源:互联网 发布:高中毕业旅行知乎 编辑:程序博客网 时间:2024/04/29 02:56


题目大意:实现下一个排列,将一些数字按照字典序大小,找到字典序在它后面一个的数字组合。

假如此数字排列为最大,则返回最小的字典序。交换必须就地实现,即在原空间完成,不能分配额外的内存空间。

例:1,2,3返回1,3,2;3,2,1返回1,2,3。


思路:

前面看STL源码剖析时,看过此算法的实现原理。因此直接实现即可。

对于一个排列,要找下一个排列,,设排列用一个数组a表示,分为以下几步:

1、从尾端向前寻找两个相邻元素,分别设为i,i+1,使得满足a[i]<a[i+1]。

2、从尾端寻找另一个元素j,使得a[i]<a[j],此时将a[i]和a[j]交换。

3、将a[i+1]和a[i+1]之后的所有元素逆序,此时结果即为所求。

例:1,2,3,6,5,4,此时第一步得到i=2,第二步得到j=5,交换得到1,2,4,6,5,3;第三步,将i+1=3和它之后的元素逆序,即6,5,3,得到3,5,6。


下面是ac的代码,运行时间12ms:

class Solution {public:    void nextPermutation(vector<int>& nums) {        if(nums.size()==0)return;int i=nums.size()-1;while(i-1>=0&&nums[i]<=nums[i-1])--i;--i;if(i==-1){reverse(nums.begin(),nums.end());return;}int j=nums.size()-1;while(nums[j]<=nums[i])--j;swap(nums[i],nums[j]);reverse(nums.begin()+i+1,nums.end());    }};





0 0
原创粉丝点击