注意字典序最大,就是下一个排序,是全部比当前排序大排序中的最小的情况。
因此首先找到第一个反序的位置,之后找到次大数和它交换,再把后面全部数字reverse即可。
class Solution {
public:
void nextPermutation(vector<int>& nums) {
if(nums.size() == 0) return;
int s = 0;
int flag = 0;
for(int i = nums.size()-1; i > 0; i--){
if(nums[i] > nums[i-1]){
s = i - 1;
flag = 1;
break;
}
}
if(flag == 0){
reverse(nums, 0, nums.size()-1);
return;
}
else{
for(int i = nums.size()-1; i > s; i--){
if(nums[s] < nums[i]){
swap(nums[s], nums[i]);
reverse(nums, s+1, nums.size()-1);
break;
}
}
return;
}
}
void swap(int &a, int &b){
int tmp = a;
a = b;
b = tmp;
}
void reverse(vector<int>& nums, int s, int e){
if(s == e) return;
for(int i = s; i <= (s+e)/2; i++){
swap(nums[i], nums[s+e-i]);
}
return;
}
};