寻找全排列的下一个数:字典序算法 leetcode 31

题目
给出一个正整数,找出这个正整数所有数字全排列的下一个数。
说通俗点就是在一个整数所包含数字的全部组合中,找到一个大于且仅大于原 数的新整数。让我们举几个例子。
如果输入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;
    }
}
发布了11 篇原创文章 · 获赞 1 · 访问量 188

猜你喜欢

转载自blog.csdn.net/z591593455/article/details/104570576