void nextPermutation(vector<int>& nums) {
int len=nums.size(),first,last,i;
for(i=len-2;i>=0;i--)
{
if(nums[i+1]>nums[i])
{
first=i;
break;
}
}
if(i==-1) {reverse(nums.begin(),nums.end());return;}//本来用的sort,但发现它是个逆序数组,reverse更加高效
else
{
for(int j=len-1;j>first;j--)
{
if(nums[j]>nums[first])
{last=j;break;}
}
swap(nums[first],nums[last]);
reverse(nums.begin()+first+1,nums.end());
}
}
本质上是一个数学问题,关键在于发现其中的规律。从后往前先找到第一个逆序的数first,然后再从后往前找到第一个比first大的数,交换两者,再取逆即可,非常符合数学逻辑。虽然代码可以写得更简洁一点,但可读性更为重要。发现自己的解法和标准解法思路一致,很开心。