> 文档中心 > 九日集训day5【刷题】【九日集训】

九日集训day5【刷题】【九日集训】

在这里插入图片描述

前言

今天是第5天,后面两题有点难搞,耽误了点时间,英雄哥解法真是妙啊。

912. 排序数组

int cmp(const void* e1, const void* e2){    return *(int*)e1 - *(int*)e2;}int* sortArray(int* nums, int numsSize, int* returnSize){    qsort(nums, numsSize, sizeof(int), cmp);    *returnSize = numsSize;    return nums;}

169. 多数元素

排序一下,多数元素一定在中间位置。

int CmpByInt(const void* e1, const void* e2){    return *(int*)e1 - *(int*)e2;}//排序,返回中间的数int majorityElement(int* nums, int numsSize){    qsort(nums,numsSize,sizeof(nums[0]),CmpByInt);    int left = 0;    int right = numsSize-1;    int mid = (right-left)/2 + left;    return nums[mid];}

217. 存在重复元素

如果存在,排序完毕之后,必然相邻

int CmpByInt(const void* e1, const void* e2){    return *(int*)e1 - *(int*)e2;}bool containsDuplicate(int* nums, int numsSize){    qsort(nums,numsSize,sizeof(nums[0]),CmpByInt);    //注意要比较前一个,避免越界    for(int i = 1; i < numsSize; i++)    { if(nums[i] == nums[i-1])     return true;    }    return false;}

164. 最大间距

int CmpByInt(const void* e1, const void* e2){    return *(int*)e1 - *(int*)e2;}int maximumGap(int* nums, int numsSize){    if(sizeof(nums)/sizeof(nums[0]) < 2) return 0;    qsort(nums, numsSize, sizeof(int), CmpByInt);    int max = 0;    //i从1开始,避免越界    for(int i = 1; i < numsSize; i++)    { if(nums[i]-nums[i-1] > max)     max = nums[i]-nums[i-1];    }    return max;}

905. 按奇偶排序数组

int CmpByEven(const void* e1, const void* e2){    return (*(int*)e1)%2 - (*(int*)e2)%2;}int* sortArrayByParity(int* nums, int numsSize, int* returnSize){    qsort(nums, numsSize, sizeof(int), CmpByEven);    *returnSize = numsSize;    return nums;}

539. 最小时间差

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;    //sscanf 从一个字符串中提取(转化)出格式化的数据    for(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;}

976. 三角形的最大周长

利用两边之和大于第三边的性质即可

从最大的三个数开始判断,如果满足,那必然是最大的周长了。

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 - 2] + nums[i - 1] > nums[i])     return nums[i - 2] + nums[i - 1] + nums[i];    }    return 0;}

881. 救生艇

考虑最重的那个人能不能和最轻的人一起坐船,如果不能表示最重的人只能单独坐船。

只剩一个人,直接一个人坐船即可

int cmp(const void *a, const void *b){    return *(int *)a - *(int *)b;}int numRescueBoats(int* people, int peopleSize, int limit){    int left = 0, right = peopleSize-1;    int count = 0;    //先排序    qsort(people, peopleSize, sizeof(people[0]), cmp);    while(left <= right)    { if(left == right) {     count++;//单独坐船     break;//没人时要结束循环 } else if(people[left] + people[right] > limit)     count++, right--; else     count++, right--, left++;    }    return count;}