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 };
从后往前找,右边数字若构成一个右斜的斜面,则继续查找
若某一时刻出现山峰,则在右边斜面找一个恰好比山峰左边数字大的数字,将其这个数字和山峰左边数字交换
此时山峰右边仍然是个右斜斜面,即递减的,将这个斜面逆置即为结果
这里的特殊情况是只有俩数字,或者整个就是一右斜斜面,不构成山峰,这两种情况都是逆置输出即可。
浙公网安备 33010602011771号