leetcode-Next Permutation-31
输入一个序列,求字典序更大的下一个序列
可以直接调用next_permutation(),一行搞定
非要写出实现细节的话,就是从后往前遍历,找到递减序列的前一个元素设为x,如果整个序列是递减的,直接reverse,否则将x与递减序列的第一个大于它的数交换,然后reverse递减序列。寻找递减序列中第一个大于x的数用了二分,不过这里是递减的,所以二分代码稍有改动。
注意,这里的元素可以重复
1 class Solution { 2 public: 3 void nextPermutation(vector<int>& nums) { 4 //next_permutation(nums.begin(),nums.end()); 5 if(nums.size()>1){ 6 int i=nums.size()-1; 7 while(i>0&&nums[i]<=nums[i-1]){ 8 i--; 9 } 10 if(i==0){ 11 reverse(nums.begin(),nums.end()); 12 return; 13 } 14 int l=i,r=nums.size()-1; 15 int j=0; 16 while(l<=r){ 17 int mid=(l+r)>>1; 18 if(nums[mid]>nums[i-1]){ 19 j=mid; 20 l=mid+1; 21 } 22 else r=mid-1; 23 } 24 // cout<<j<<endl; 25 // cout<<i<<endl; 26 int tmp=nums[i-1]; 27 nums[i-1]=nums[j]; 28 nums[j]=tmp; 29 //for(int i=0;i<nums.size();i++) cout<<nums[i]<<" ";cout<<endl; 30 for(int k=i;k<=(nums.size()-1+i)/2;k++){ 31 tmp=nums[k]; 32 nums[k]=nums[nums.size()-k+i-1]; 33 nums[nums.size()-1-k+i]=tmp; 34 // cout<<k<<" "<<nums.size()-k+i-1<<endl; 35 } 36 // for(int i=0;i<nums.size();i++) cout<<nums[i]<<" ";cout<<endl; 37 return; 38 } 39 } 40 };