1 class Solution 
 2 {
 3 public:
 4     void nextPermutation(vector<int>& nums) 
 5     {
 6         int sz=nums.size();    
 7         int loc=-1,bigger=sz-1;
 8         for(int i=sz-2;i>=0;i--)
 9         {
10             if(nums[i+1]<=nums[i])
11                 continue;
12             else if(nums[i+1]>nums[i])
13             {
14                 loc=i;
15                 break;
16             }
17         }
18         if(sz==2||loc==-1)
19             reverse(nums.begin(),nums.end());
20         else
21         {
22             while(nums[bigger]<=nums[loc])
23                 bigger--;
24             swap(nums[loc],nums[bigger]);
25             loc++;
26             reverse(nums.begin()+loc,nums.end());
27         }     
28     }
29 };

从后往前找,右边数字若构成一个右斜的斜面,则继续查找

若某一时刻出现山峰,则在右边斜面找一个恰好比山峰左边数字大的数字,将其这个数字和山峰左边数字交换

此时山峰右边仍然是个右斜斜面,即递减的,将这个斜面逆置即为结果

这里的特殊情况是只有俩数字,或者整个就是一右斜斜面,不构成山峰,这两种情况都是逆置输出即可。

posted on 2018-07-06 17:18  高数考了59  阅读(122)  评论(0)    收藏  举报