《LeetCode零基础指南》(第六讲) C排序API
正在上传…重新上传取消申晓宇2021-12-05 19:49:02
今天的题进一步加深了我对数组和指针的认识
上图
一、排序数组
1.int cmp(const void*a, const void*b){
2.return *(int *)a - *(int *)b;
3.}
4.int* sortArray(int* nums, int numsSize, int* returnSize){
5.qsort(nums, numsSize, sizeof(int), cmp);
6.* returnSize = numsSize;
7.return nums;
8.}
二、多数元素(要注意int型的范围)
int cmp(const void*a, const void*b){
return *(unsigned int *)b - *(unsigned int *)a;
}
int majorityElement(int* nums, int numsSize){
qsort(nums, numsSize, sizeof(int), cmp);
return nums[numsSize / 2];
}
三、存在重复元素
1.int cmp(const void*a, const void*b){
2.return *(int *)a - *(int *)b;
3.}
4.bool containsDuplicate(int* nums, int numsSize){
5.qsort(nums, numsSize, sizeof(int), cmp);
6.int i;
7.for(i = 0; i < (numsSize - 1); ++i){
8.if(nums[i] == nums[i + 1]){
9.return true;
10.}
11.}
12.return false;
13.}
14.}
四、最大间距
int cmp(const void*a, const void*b){
return *(int *)a - *(int *)b;
}
int maximumGap(int* nums, int numsSize){
int i = 0;
qsort(nums, numsSize, sizeof(int), cmp);
if(numsSize < 2){
return 0;
}
int max = (nums[i + 1] - nums[i]);
for(i =1; i < (numsSize - 1); ++i){
if( max < (nums[i + 1] - nums[i]) ){
max = nums[i + 1] - nums[i];
}
}
return max;
}
五、按奇偶排序数组
六、最小时间差(这个不看解析真不会)
1.int cmp(const void*a, const void*b){
2.return *(int *)a - *(int *)b;
3.}
4.int min(int a, int b){
5.return (a > b) ? b : a;
6.}
7.int findMinDifference(char ** timePoints, int timePointsSize){
8.int *ret = (int *)malloc(sizeof(int) * timePointsSize);
9.int m , n;
10.int i, ans = 1440;
11.for(i = 0; i < timePointsSize; ++i){
12.sscanf(timePoints[i], "%d:%d", &m, &n);
13.ret[i] = m * 60 + n;
14.}
15.qsort(ret, timePointsSize, sizeof(int), cmp);
16.for(i = 1; i < timePointsSize; ++i){
17.ans = min(ans, ret[i] - ret[i - 1]);
18.}
19.ans = min(ans, ret[0] - ret[timePointsSize - 1] + 1440);
20.return ans;
21.}
七、三角形的最大周长
int cmp(const void*a, const void*b){
return *(int *)a - *(int *)b;
}
int largestPerimeter(int* nums, int numsSize){
int i;
qsort(nums, numsSize, sizeof(int), cmp);
for(i = numsSize - 1; i >= 2; --i){
if(nums[i - 1] + nums[i - 2] > nums[i]){
return (nums[i] + nums[i - 1] + nums[i - 2]);
}
}
return 0;
}
八、救生艇
int cmp(const void*a, const void*b){
return *(int *)a - *(int *)b;
}
int numRescueBoats(int* people, int peopleSize, int limit){
int ans = 0;
int m = 0, k = peopleSize - 1;//people[m]表示所剩的体重最轻的人的体重,people[k]体重最重的人
qsort(people, peopleSize, sizeof(int), cmp);
while(k >= m){
if(k == m){
++ans;
break;
}
else if(people[m] + people[k] <= limit){
++ans;
++m;
k--;
}
else{
++ans;
--k;
}
}
return ans;
}
大家一定要防止数组越界啊!!!
总结
今天的题写了4、5个小时,但是值得的,自己也学到了很多,开心。
刷Leetcode时,出现了问题不要慌,要像英雄哥视频所说的,自己多造一些测试用例,进而找到方向
最后,希望大家多多关注英雄哥(手动狗头)