[学习报告]《LeetCode零基础指南》(第六讲) C排序API---v1.0

0. 知识点

《LeetCode零基础指南》(第六讲) C排序API

  1. Trick:qsort()排序API的用法
    (1)
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*));

(2)int compar(const void *p1, const void *p2);
递增

int cmp(const void *p1, const void *p2) {
    return (*(int *)p1) - (*(int *)p2);
}

递减

int cmp(const void *p1, const void *p2) {
    return (*(int *)p2) - (*(int *)p1);
}


1. 解题报告:

Q1:912. 排序数组

/**Q1_method_0.0:利用qsort()
 * Note: The returned array must be malloced, assume caller calls free().
 */
 /*cmp()是新增的函数*/
int cmp(const void *a,const void * b)
{
    return *(int *)a-*(int *)b;
}

int* sortArray(int* nums, int numsSize, int* returnSize){
    int* ans = (int *)malloc(sizeof(int)*numsSize);/*范式*/
     *returnSize = numsSize;

    qsort(nums,numsSize, sizeof(int), cmp);

    ans = nums;

    return ans;
}

Q2:169. 多数元素

int majorityElement(int* nums, int numsSize){
    /*条件规定所给的数组总是存在多数元素*/
    /*s1:nums排序*/
    /*cmp回调*/
    int cmp(const void *a,const void * b)
    {
        return *(int *)a-*(int *)b;
    }

    qsort(nums,numsSize, sizeof(int), cmp);

    /*s2:取中间值*/
    
    return *(nums + numsSize/2);
}

Q3:217. 存在重复元素

bool containsDuplicate(int* nums, int numsSize){
    /*s1:先排序*/
    int cmp(const void *a,const void * b)
    {
        return *(int *)a-*(int *)b;
    }

    qsort(nums,numsSize, sizeof(int), cmp);

    /*s2:遍历,寻找相邻两项相等*/
    int i;
    for(i=1;i<numsSize;++i)
    {
        if(nums[i]==nums[i-1])
        {
            return true;
        }
    }

    return false;
}

Q4:164. 最大间距

int maximumGap(int* nums, int numsSize){
    /*s1:特殊情况,数组元素个数小于2个*/
    if(numsSize < 2)
    {
        return 0;
    }

    /*s2:qsort()排序,增序
    (假设已是增序,先验假设*(int *)a<*(int *)b*/
    int cmp(const void *a,const void * b)
    {
        return *(int *)a-*(int *)b;
    }

    qsort(nums,numsSize, sizeof(int), cmp);
   
   /*s3: 遍历,打擂台法*/
   
   int i,max2;
   int max = *(nums+1)-*(nums);
   for(i = 2;i<numsSize;++i)
   {
        
        max2 = *(nums+i)-*(nums+i-1);
        /*将该比较大小的功能模块封装成为函数*/
        if(max2 > max)
        {
            max = max2;
        }
   }

   return max;

}

Q5:905. 按奇偶排序数组

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* nums, int numsSize, int* returnSize){

    /*s1:自定义数组*/
    int * ans = (int *)malloc(sizeof(int)*numsSize);
    * returnSize = numsSize;

    int Qua(int x) {
    return x % 2;
    }
    /*tips:谁排在前,谁在“-”前
    *假设演绎法:(1)偶在前,奇在后;
                (2)保证增序,需要保证小减大
                (3)递减--是大减小
    */
    int cmp(const void *p1, const void *p2) {
        return Qua(*(int *)p1) - Qua(*(int *)p2);
    }

    qsort(nums,numsSize,sizeof(int),cmp);
    ans = nums;

    return ans;
    


}

Q6: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){
    /*s0:malloc一个数组*/
    int *ret = (int *)malloc(sizeof(int)*timePointsSize);

    
    /*s1:格式转换,将“HH:MM”格式转换为分钟数*/
    int i,ans;
    int a,b;
    for(i=0;i<timePointsSize;++i)
    {
        sscanf(*(timePoints+i),"%d:%d",&a,&b);
        *(ret+i)=a*60+b;
    }

    /*s2:使用qsort排序*/
    qsort(ret,timePointsSize,sizeof(int),cmp);
    /*s3:遍历,比较,使用"打擂台"法求最小值*/
    ans=*(ret+1)-*(ret);
    for(i=2;i<timePointsSize;++i)
    {
        ans = min(ans,*(ret+i)-*(ret+i-1));
    }
    /*s4:考虑特殊情况,即排序后的首尾2项
    ,因为例如[00:00]与[23:59]的时间差实际上是一分钟,所以要使用补码的思想*/
    ans = min(ans,(ret[0]+(1440-ret[timePointsSize-1]))%1440);
    return ans;

}

Q7:976. 三角形的最大周长

int cmp(const void *a,const void *b)
{
    /*递减*/
    return *(int *)b-*(int *)a;
}

int largestPerimeter(int* nums, int numsSize){
    qsort(nums,numsSize,sizeof(int),cmp);

    int i;
    for(i=0;i<numsSize-2;++i)
    {
        if(nums[i+1]+nums[i+2]>nums[i])
        return nums[i+1]+nums[i+2]+nums[i];
    }

    return 0;

}

Q8:881. 救生艇

int cmp(const void *a,const void *b)
{
    /*递减*/
    return *(int *)b-*(int *)a;
}

int numRescueBoats(int* people, int peopleSize, int limit){
    /*递减排序*/
    qsort(people,peopleSize,sizeof(int),cmp);

    int cnt_ship=0;
    int l=0,r=peopleSize-1;
    /*Trick:(1)按重量从大到小排列
(2)如果只剩一个即:l = r,船cnt_ship++,break;退出循环
(3)如果首尾相加大于limit,则cnt_ship++,l++;
(4)如果首尾相加小于或等于limit,则cnt_ship++,l++,r--;

*/
    while( l <= r )/*控制左右不会出现交错的情况*/
    {
        if( l == r)
        {
            cnt_ship++;
            break;
        }
        else if(people[l]+people[r]>limit)/*误:*/
        {
            cnt_ship++;l++;
        }
        else 
        {
            cnt_ship++;l++;r--;
        }
    }

    return cnt_ship;

}

2. 思考总结:

(1)程序书写时,字母注意力要在显示屏上,而不是键盘上。while–>whlie,people–>poeple,[ ]–>()。
(2)了解了qsort()排序的用法,需要配合int cmp(const void *a,const void *b)。
(3)对LeetCode更加熟悉。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值