LeetCode-31-Next Permutation(C语言实现)

本文介绍了如何使用C语言实现LeetCode的31号问题——找到给定整数数组的下一个排列。通过从倒数第二个元素开始查找,确定可以交换的位置,并利用快速排序调整后续元素,来生成下一个排列。如果无法通过这种方式生成,再进行数组反转作为备选方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}


//返回nums数组中下标l到r之间(包含l和r)比flag大的最小的数的下标
//如果没有比flag大的数则返回-1
int min(int *nums, int l, int r, int flag){
    int i, pos = -1;
    for(i = l; i <= r; ++i){
        if(nums[i] > flag){
            pos = i;
            goto step0;
        }
    }
step0:
    for(i = pos + 1; i <= r; ++i){
        if(nums[i] > flag && nums[i] < nums[pos]){
            pos = i;
        }
    }
    return pos;
}


//思路:从倒数第二位数开始依次查找该数nums[i]后面是否有大于它的数
//如果有,用min函数获得大于它的数中最小的数的下标pos,并交换nums[i]和nums[pos]
//再对第i位之后的数进行快排,即得到结果
void nextPermutation(int* nums, int numsSize) {
    bool able = false;
    int i, tmp, pos;
    for(i = numsSize - 2; i >= 0; --i){
        pos = min(nums, i + 1, numsSize - 1, nums[i]);
        if(pos != -1){
            tmp = nums[i];
            nums[i] = nums[pos];
            nums[pos] = tmp;
            qsort(&nums[i + 1], numsSize - i - 1, sizeof(int), cmp);
            able = true;
            goto step;
        }
    }
step:
    if(!able){
        for(i = 0; i < numsSize / 2; ++i){
            tmp = nums[i];
            nums[i] = nums[numsSize - 1 - i];
            nums[numsSize - 1 - i] = tmp;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值