实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3
→ 1,3,2
3,2,1
→ 1,2,3
1,1,5
→ 1,5,1
void nextPermutation(int* nums, int numsSize){
if(numsSize<2)return;
int break_pos=-1;
for(int i=numsSize-2;i>=0;--i)
{
if(nums[i]<nums[i+1])
{
break_pos=i;
break;
}
}
if(break_pos==-1)
{
int count=(numsSize+1)/2;
int tmp;
for(int i=0;i<count;++i)
{
tmp=nums[numsSize-1-i];
nums[numsSize-1-i]=nums[i];
nums[i]=tmp;
}
}
else
{
for(int i=numsSize-1;i>break_pos;i--)
{
if(nums[i]>nums[break_pos])
{
int tmp=nums[i];
nums[i]=nums[break_pos];
nums[break_pos]=tmp;
for(int j=numsSize-1,k=break_pos+1;k<j;--j,++k)
{
tmp=nums[j];
nums[j]=nums[k];
nums[k]=tmp;
}
break;
}
}
}
}
执行用时 : 12 ms, 在Next Permutation的C提交中击败了90.52% 的用户
内存消耗 : 7.4 MB, 在Next Permutation的C提交中击败了87.32% 的用户