九日集训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;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值