文章目录
今日知识总结
-
void qsort(void *base, size_t nitems,int (compare)(const void*,const void *)
-
参数:
- base:指向排序数组的第一个指针
- nitems:由base指向的数组中的元素个数
- size:数组中的每个元素的大小,以字节为单位。
- compare :用来比较两个元素的函数,即函数指针(比较算法的回调函数)
-
例子:
int a[5]={1, 2, 3, 4, 5}; qsort(a, 5, sizeof(int), cmp); int cmp(const void *p1, const void *p2){ int v1 = *(int*)p1; int v2 = *(int*)p2; if(v1 < v2){ return -1; }else if(v1 > v2){ return 1; } return 0; } //简化写法 //前提是要保证数组的数据不会超过32位整型 int cmp(const void *p1, const void *p2){ return (*(int*)p1) - (*(int*)p2); } {1, 2, 3, 4, 5};
-
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CmHcC2qH-1651414771712)(C:\Users\宋亚轩赛高\AppData\Roaming\Typora\typora-user-images\image-20220407235035498.png)]
题目分析
-
-
题目链接:https://leetcode-cn.com/problems/sort-an-array/
-
思路:
-
代码:
int cmp(const void *p1, const void *p2){ return (*(int*)p1) - (*(int*)p2); } int* sortArray(int* nums, int numsSize, int* returnSize){ qsort(nums, numsSize, sizeof(int), cmp); *returnSize = numsSize; return nums; }
-
-
-
题目链接:https://leetcode-cn.com/problems/majority-element/
-
思路:可知多数元素一定是数组里数量最多的元素,也就是众数由下图可以看出规律,在
nums[numSize / 2]
的位置上一定是我们所要返回的答案1 2 3 4 5 5 5 5 2 3 3
-
代码
int cmp(const void *p1, const void *p2){ return (*(int*)p1 ) - (*(int*)p2); } int majorityElement(int* nums, int numsSize){ qsort(nums, numsSize, sizeof(int), cmp); return nums[numsSize / 2]; }
-
-
-
题目链接:https://leetcode-cn.com/problems/contains-duplicate/
-
思路:从大到小排序,从第二个数字开始比较,如果与前一个数字相同就返回true
-
代码:
int cmp(const void *p1, const void *p2){ return(*(int*)p1) - (*(int*)p2); } 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; }
-
-
-
题目链接:https://leetcode-cn.com/problems/maximum-gap/
-
思路:给数组排序,不断维护最大值
-
代码:
int cmp(const void *p1, const void *p2){ return (*(int*)p1) - (*(int*)p2); } int maximumGap(int* nums, int numsSize){ if(numsSize < 2) return 0; qsort(nums, numsSize, sizeof(int), cmp); int max = 0; for(int i = 1; i < numsSize; i++){ if(nums[i] - nums[i - 1] > max) max = nums[i] - nums[i - 1]; // printf("%d", nums[i]); } return max; }
-
-
-
题目链接:https://leetcode-cn.com/problems/sort-array-by-parity/
-
思路:
-
代码:
/** * Note: The returned array must be malloced, assume caller calls free(). */ int cmp(const void *p1, const void *p2){ int a = (*(int*) p1) % 2; int b = (*(int*) p2) % 2; if(a - b == 1) return 1; return 0; } int* sortArrayByParity(int* nums, int numsSize, int* returnSize){ qsort(nums, numsSize, sizeof(int), cmp); *returnSize = numsSize; return nums; }
-
-
-
题目链接:https://leetcode-cn.com/problems/minimum-time-difference/
-
思路:把字符串转换成对应的数字,接着按照从小到大的顺序排序,最后把不断维护最短的时间差,要记得算最小的时间和最大的时间
-
代码:
int cmp(const void *p1, const void *p2){ return (*(int*)p1) - (*(int*)p2); } int min(int a, int b){ return a > b ? b : a; } int findMinDifference(char ** timePoints, int timePointsSize){ int *ret = (int *)malloc(sizeof(int) * timePointsSize); int i, ans = 1440; int a, b; for(int i = 0; i < timePointsSize; i++){ sscanf(timePoints[i], "%d:%d", &a, &b); ret[i] = a * 60 + b; } qsort(ret, timePointsSize, sizeof(int), cmp); for(i = 1; i < timePointsSize; i++){ ans = min(ans, ret[i] - ret[i - 1]); } ans = min(ans, ret[0] - ret[timePointsSize - 1] + 1440); return ans; }
-
-
-
题目链接:https://leetcode-cn.com/problems/largest-perimeter-triangle/
-
思路:构成三角形的基本条件,两边之和大于第三边,首先判断能否构成三角形,接着判断周长是否比当前最大值,维护最大值
-
代码:
int cmp(const void *p1, const void *p2){ return (*(int *)p1) - (*(int*)p2); } int largestPerimeter(int* nums, int numsSize){ qsort(nums, numsSize, sizeof(int), cmp); int max = 0; for(int i = 2; i < numsSize; i++){ if(nums[i - 2] + nums[i - 1] > nums[i]) if(max < nums[i] + nums[i - 1] + nums[i - 2]) max = nums[i] + nums[i - 1] + nums[i - 2]; } return max; }
-
今日收获:
sscanf()
可以把字符串里的数字变成数字