受这篇博客启发,并自己试着按字典顺序枚举1-5全排列,得出思路如下:
1.从右往左遍历,找到第一个比后一个小的数
2.从这个数开始,找到后面比它大又与它最接近的数,交换这两个数
3.从交换的后一个位置开始,从小到大排序
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int i,n=nums.size(),j,mark,delta,tmp;
if(n==1)
return;
for(i=n-2;i>=0;i--)
{
if(nums[i]<nums[i+1])
break;
}
if(i<0)
{
sort(nums.begin(),nums.end());
return;
}
delta=nums[i+1]-nums[i];
mark=i+1;
for(j=i+2;j<n;j++)
{
if(nums[j]-nums[i]>0 && nums[j]-nums[i]<delta)
mark=j;
}
tmp=nums[i];
nums[i]=nums[mark];
nums[mark]=tmp;
sort(nums.begin()+i+1,nums.end());
}
};