【LeetCode31】
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i=nums.size()-1;
int tmp;
int flag=0;
if(nums.size()==0||nums.size()==1)
{
return;
}
while(i>0)
{
if(nums[i]<=nums[i-1])
{
i--;
}
else
{
int j=nums.size()-1;
while(j>=i)
{
if(nums[j]>nums[i-1])
{
tmp=nums[j];
nums[j]=nums[i-1];
nums[i-1]=tmp;
reverse(nums.begin()+i,nums.end());
flag=1;
break;
}
j--;
}
if(flag==1)
{
break;
}
i--;
}
}
if(flag==0)
reverse(nums.begin(),nums.end());
}
};
注意点:
1.长度为0,1的特判
2.reverse的使用
大体思路:
- 从后往前找到第一个【相邻升序对】,即A[i]<A[i+1]。此时A[i+1,end)为降序。
- 在区间[i+1,end)中,从后往前找到第一个大于A[i]的元素A[j]
- 交换A[i]和A[j],此时A[i+1,end)一定还是降序,因为A[j]是从右侧起第一个大于A[i]的值
- 反转A[i+1,end),变成升序