题意:给你一串数字(当然也可以理解成整体是一个数),求这些数字字典序排列中的下一种排列
分析:从左到右,先不断寻找左边数字比右边数字大的位置(只有这样才能通过把右边数与左边换使数字整体变大的效果),然后不断向右扫描找这种情况的最小可能(因为是字典序次大嘛。。),然后从尽可能右侧找个数字把固定那个位置的数字换掉(此时该位置以右肯定是从大到小排列的,所以为了换的数字尽量小。。),最后一个reverse,让后面那些数最小就行(注意即使换过了之后右侧那些数依旧是从大到小排列的)
AC:
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int n=nums.size();
int bt=-1;
int bl=0;
for(int i=0;i<n-1;i++)
{
if(nums[i]<nums[i+1])
bt=i;
}
if(bt>=0)
{
for(int i=n-1;i>=bt;i--)
{
if(nums[i]>nums[bt])
{
bl=i;
break;
}
}
swap(nums[bt],nums[bl]);
reverse(nums.begin()+bt+1,nums.end());
}
else
reverse(nums.begin(),nums.end());
}
};