![](https://img2018.cnblogs.com/blog/1588437/201905/1588437-20190528113928188-1976665016.png)
/**
验证一般情况(元素数目大于等于3)有几个情况分析:
两个特殊情况:
6 5 4 3 2 1 完全反序,这种序列没有下一个排序,因此重新排序1 2 3 4 5 6
1 2 3 4 5 6 完全升序,很容易看出翻转5 6得到下一个排序;
因此对于以下一般情况有:
1 2 6 5 4 3 找到右边第一个a[i]<a[i+1]的元素2,再从右往左找出2的下一个元素3,交换2,3,之后对2右边元素reverse;
1 2 5 4 6 3 从右往左找到第一个a[i]<a[i+1]的元素4,从右往左找到第一个大于4的元素6,交换4,6,之后对4右边的元素reverse;
这样操作是因为找到的元素a[i]的右侧已经全部为逆序了,下一个排列必然要带上i-1重新排;
即,找到a[i]后,以第i个元素为分界线,a[i]和a[i+1]是一个完全升序序列,a[i+1]到末尾是一个完全反序序列,对子问题进行分解交换即可;
**/
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int len=nums.size();
if(len<=1) return;
int i=len-2;
while(i>=0&&nums[i]>=nums[i+1])
i--;
if(i>=0){
int j=len-1;
while(nums[j]<=nums[i])
j--;
swap(nums,i,j);
}
reverse_rest(nums,i+1);
}
void reverse_rest(vector<int>&nums,int start){
int i=start,j=nums.size()-1;
while(i<j){
swap(nums,i,j);
i++;j--;
}
}
void swap(vector<int>&nums,int i,int j){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
};