qsort函数的应用,双指针

关于qsort函数如何使用,可以参考一下这位大佬的文章

https://blog.csdn.net/zhao888789/article/details/79186619?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164198524116780366561693%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164198524116780366561693&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-79186619.pc_search_insert_ulrmf&utm_term=qsort%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187icon-default.png?t=LBL2https://blog.csdn.net/zhao888789/article/details/79186619?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164198524116780366561693%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164198524116780366561693&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-79186619.pc_search_insert_ulrmf&utm_term=qsort%E5%87%BD%E6%95%B0&spm=1018.2226.3001.4187

先来一道简单点的 https://leetcode-cn.com/problems/set-mismatch/

我们可以先对数组进行排序,然后观察数组,发现相邻的两个元素如果相差0,则说明两个元素重复,如果相邻的两个元素相差2,说明缺的元素就是两个元素之间的。有个特殊情况就是当最后两个元素重复时可能不存在相邻元素相差2的情况,最后特判一下就行了。

当然这道题还有更简单的方法,这里我们用sqort函数排序去做。

代码如下:

 int cmp(const void *a, const void *b) {
    int *a1 = (int*)a;
    int *b1 = (int*)b;
    return *a1 - *b1;
}
int* findErrorNums(int* nums, int numsSize, int* returnSize){
    int *a = (int *)malloc(sizeof(int)*2);
    qsort(nums,numsSize,sizeof(nums[0]),cmp);

    int pre = 0;

    for(int i=0;i<numsSize;i++)
    {
        if(nums[i] - pre==0)
        a[0] = nums[i];
        else if(nums[i] - pre==2)
        a[1] = pre + 1;
        
        pre = nums[i];
    }

    if(nums[numsSize-1] != numsSize)
    a[1] = numsSize;

    * returnSize = 2;
    return a;
}

下一题: https://leetcode-cn.com/problems/relative-ranks/

也是一道排序题,不过要和运动员的编号进行捆绑排序 ,还有一个点是力扣答案都是以函数的形式,这道题要返回一个二级指针,一时间不知道这么做了。

代码如下:

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

char *str[] = {"Gold Medal","Silver Medal","Bronze Medal"};

char ** findRelativeRanks(int* score, int scoreSize, int* returnSize){
    int arr[scoreSize][2];
    /* 存储下标, 并从小到大排序 */
    for (int i = 0; i < scoreSize; i++) {
        arr[i][0] = -score[i]; /* 取负后从小到大排序 */
        arr[i][1] = i;
    }
    qsort(arr, scoreSize, sizeof(arr[0]), cmp);

    /* 从小到大进行输出, 输出到对应下标的字符串中 */
    char **res = (char**)malloc(sizeof(char*) * scoreSize);
    for (int i = 0; i < scoreSize; i++) {
        if (i < 3) {
            res[arr[i][1]] = str[i];
        } else {
            res[arr[i][1]] = (char*)malloc(sizeof(char) * 8);
            sprintf(res[arr[i][1]], "%d", i + 1);
        }
    }
    *returnSize = scoreSize;
    return res;
}

下一题:https://leetcode-cn.com/problems/boats-to-save-people/

 开始没有注意到每搜船最多同时载两人的条件,方向都弄错了。排序完后其实就是一个双指针问题,根据贪心策略,我们优先将最轻的人和最重的人捆绑在一条船上,如果超重,就换次重的人,此时最重的人要单独在一条船上。

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

int numRescueBoats(int* people, int peopleSize, int limit){
    qsort(people,peopleSize,sizeof(people[0]),cmp);

    int l = 0,r = peopleSize-1;
    int ans = 0;
    while(l<=r)
    {
        if(people[l] + people[r] > limit) r--;
        else l++,r--;
        
        ans++;
    }
    return ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值