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;
}