九日集训 Day 5 排序

1 学习内容 qsort排序

传入一个数组,以及定义对应的排序规则,就能对数组进行就地排序。

void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));

2 Leetcode 刷题

2.1 数组从小到大进行排序

相关题目

数组排序数组

数组中的多数元素

数组中的重复元素

元素间的最大间距

以上四道题目的思路类似,都是对数组进行从小到大的排序后,找出符合题意的元素。

其中,数组排序是最基础的内容。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
 int cmp(const void*a, const void*b){
     return *(int *)a - *(int *)b;
 }
int* sortArray(int* nums, int numsSize, int* returnSize){
    qsort (nums, numsSize, sizeof(int), cmp);
    *returnSize = numsSize;
    return nums;
}

再进阶的内容,如第3题 数组中的重复元素 只需要对数组进行排序后,判断是否存在相邻两个元素相等的情况。

int cmp(const void *a, const void *b){
    return (*(int *)a) - (*(int *)b);
}
bool containsDuplicate(int* nums, int numsSize){
    qsort(nums, numsSize, sizeof(int), cmp);
    for (int i = 1; i<numsSize; ++i){
        if(nums[i] == nums[i-1]){
            return true;
        }
    }
    return false;
}

相似地,第4题需要遍历排序完成的数组,对其中的元素进行两两相减,将最大差值返回即可。

int cmp(const void *a, const void *b){
    return *(int *)a - *(int *)b;
}
int maximumGap(int* nums, int numsSize){
    int max_num = 0;
    qsort(nums, numsSize, sizeof(int), cmp);
    for (int i = 1; i<numsSize; ++i){
        if(nums[i] - nums[i-1]>max_num){
            max_num = nums[i] - nums[i-1];
        }
    }
    return max_num;
}

2.2 奇偶排序

相关题目 数组的奇偶排序

这个题目更换qsort的排序条件即可。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int Qua (int x){
    return x & 1;
}

int cmp(const void *a, const void *b){
    return Qua(*(int *)a) - Qua(*(int *)b);
}
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){
    int *ret = (int *)malloc(sizeof(int)*numsSize);
    for (int i = 0; i<numsSize; ++i){
        ret[i] = nums[i];
    }
    qsort (ret, numsSize, sizeof(int), cmp);
    *returnSize = numsSize;
    return ret;
}

 2.3 拓展

相关题目

最小时间差

求三角形的最大周长

救生艇问题

以上3道题目需要额外添加判断条件,逻辑上更加复杂,技术上跟上述题目使用同样的方法。

最小时间差的源码如下。

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

int min(int a, int b) {
    return a < b ? a : b;
}

int findMinDifference(char ** timePoints, int timePointsSize){
    int *ret = (int *) malloc( sizeof(int) * timePointsSize );
    int i, ans = 1440;
    int a, b;
    for(i = 0; i < timePointsSize; ++i) {
        sscanf(timePoints[i], "%d:%d", &a, &b);             // (1)
        ret[i] = a * 60 + b;                                // (2)
    }
    qsort(ret, timePointsSize, sizeof(int), cmp);           // (3)
    for(i = 1; i < timePointsSize; ++i) {
        ans = min(ans, ret[i] - ret[i-1]);                  // (4)
    }
    ans = min(ans, ret[0] - ret[timePointsSize-1] + 1440);  // (5)
    return ans;
}

 救生艇问题的源码如下。

int cmp(const void *a, const void *b){
        return *(int *)a - *(int *)b;
    }
int numRescueBoats(int* people, int peopleSize, int limit){
    int l = 0, r = peopleSize -1, ans = 0;
    qsort(people, peopleSize, sizeof(int), cmp);
    while(l<=r){
        if(l == r){
            ++ans;
            break;
        }
        else if (people[l] + people[r] > limit){
            ++ans;
            r--;
        }
        else{
            ++ans, ++l, --r;
        }
    }
    return ans;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值