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 };

 

posted @ 2016-08-30 10:55  0_summer  阅读(137)  评论(0编辑  收藏  举报