题目
给出一个正整数,找出这个正整数所有数字全排列的下一个数。
说通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原 数的新整数。让我们举几个例子。
如果输入12345,则返回12354。 如果输入12354,则返回12435。
解题思路
首先 题目要求找到给出的全排列的下一个排列
那么,就要尽量高位不变,那首先确定肯定从后往前找
例如 1 2 3 5 4 这个数字
就是要找到一个数,这个数前面比他小,
那么他前面这个数就可以来到后面(位置不一定)
他后面的数找到一个最小的但是比他前面这个数大的去到前面
然后他以及他后面所有的数升序排序即可
void next(int *s,int n){
int x=0;
for(int i=n-1;i>0;i--){
if(s[i]>s[i-1]){
x=i;
break;
}
}
if(x==0)return;
for(int i=n-1;i>0;i--){
if(s[x-1]<s[i]){
int temp=s[x-1];
s[x-1]=s[i];
s[i]=temp;
break;
}
}
for(int i=x,j=n-1;i<j;i++,j--){
int temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
然后又去找了一道题 leecode 31题 下一个排列。
多了一个要求,如果不存在,就从新排列成最小的
这样的话,就是不进第二个循环,在第二个循环加个判断x,修改后的代码
void nextPermutation(int* nums, int numsSize){
int x=0;
for(int i=numsSize-1;i>0;i--){
if(nums[i]>nums[i-1]){
x=i;
break;
}
}
for(int i=numsSize-1;x!=0 && i>0;i--){
if( nums[x-1]<nums[i]){
int temp=nums[x-1];
nums[x-1]=nums[i];
nums[i]=temp;
break;
}
}
for(int i=x,j=numsSize-1;i<j;i++,j--){
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}