IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 【万人千题】九日集训第六讲,API排序 -> 正文阅读

[数据结构与算法]【万人千题】九日集训第六讲,API排序

目录

一:知识点

1,排序介绍

2,qsort

二,习题

1,912. 排序数组 - 力扣(LeetCode) (leetcode-cn.com)

2,169. 多数元素 - 力扣(LeetCode) (leetcode-cn.com)

3,217. 存在重复元素 - 力扣(LeetCode) (leetcode-cn.com)

4,164. 最大间距 - 力扣(LeetCode) (leetcode-cn.com)

5,905. 按奇偶排序数组 - 力扣(LeetCode) (leetcode-cn.com)

6,539. 最小时间差 - 力扣(LeetCode) (leetcode-cn.com)

7,976. 三角形的最大周长 - 力扣(LeetCode) (leetcode-cn.com)

8,881. 救生艇 - 力扣(LeetCode) (leetcode-cn.com)

三,总结


一:知识点

1,排序介绍

排序,就是将一组数按要求有序排列。

2,qsort

今天主要介绍的是qosrt。qsort是c语言中自带的一个排序函数。可以实现各种类型数据的排序。qsort的主要参数是要排序的数组,数组的大小,排序数据的类型大小,以及一个比较函数。这个比较的函数是需要自己来写的,从而来实现排序各种类型的数据。

主体大概如下:

int arr[10];
qsort(arr,sizeof(arr),sizeof(int),cmp);

而对于cmp而言

int cmp(const void*e1,const void*e2)

?需要返回一个整数来表示如何排序

返回数值排序方法
>0e1排在e2后
=0e1和e2排序不定
<0e1排在e2前

?而这里使用void*指针主要是为了接受各种类型的数据,在cmp函数内部我们需要自己再进行强制类型转换从而得到该地址下的数据

int cmp(const void*e1,const void*e2)
{
   return *(int*)e1-*(int*)e2;
}

至于比较的方法,如果数据相减不会超出数据类型范围可以直接如上写 。

int cmp(const void*e1,const void*e2)
{
   if(*(int*)e1>*(int*)e2)
      return 1;
   else
      return 0;
}

可以使用比较来表示排的序,避免数据的溢出。?

二,习题

大家可以先去做题再来看。

1,912. 排序数组 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp_int(const void*e1,const void*e2)
{
    if(*(int*)e1>=*(int*)e2)
    return 1;
    else
    return 0;
}
int* sortArray(int* nums, int numsSize, int* returnSize)
{
        qsort(nums,numsSize,sizeof(int),cmp_int);
        *returnSize=numsSize;
        return nums;
}

直接用qsort就可以了

2,169. 多数元素 - 力扣(LeetCode) (leetcode-cn.com)

int cmp(const void*e1,const void*e2)
{
    if(*(int*)e1>=*(int*)e2)
    return 1;
    else
    return 0;
}
int majorityElement(int* nums, int numsSize)
{
    if(numsSize==1)
    return nums[0];
    qsort(nums,numsSize,sizeof(int),cmp);
    printf("%d",nums[0]);
    int i=0;
    int max=1;
    for(i=1;i<numsSize;i++)
    {
        if(nums[i]!=nums[i-1])
         max=1;
        if(nums[i]==nums[i-1])
        max++;
        if(max>numsSize/2)
        {
            return nums[i];
        }
    }
    return 0;
}

先排序,排序完之后遍历数组寻找。只要nums【i】与前一个数不相等,就是一个新的数,让max重新变成1再统计个数,直到找到个数大于n/2的数

3,217. 存在重复元素 - 力扣(LeetCode) (leetcode-cn.com)

int cmp(const void*e1,const void*e2)
{
    if(*(int*)e1>=*(int*)e2)
    return 1;
    else
    return 0;
}
bool containsDuplicate(int* nums, int numsSize)
{
    if(numsSize==1)
    return false;
    qsort(nums,numsSize,sizeof(int),cmp);
    int i=0;
    for(i=0;i<numsSize-1;i++)
    {
        if(nums[i]==nums[i+1])
        return true;
    }
    return false;
}

排序完之后,遍历数组,只要有某两个前后的数相同即为true。

4,164. 最大间距 - 力扣(LeetCode) (leetcode-cn.com)

int cmp(const void*e1,const void*e2)
{
    if(*(int*)e1>=*(int*)e2)
    return 1;
    else
    return 0;
}
int maximumGap(int* nums, int numsSize)
{
     if(numsSize<2)
     return 0;
     qsort(nums,numsSize,sizeof(int),cmp);
     int max=nums[1]-nums[0];
     int i=0;
     for(i=1;i<numsSize-1;i++)
     {
         if(nums[i+1]-nums[i]>max)
         max=nums[i+1]-nums[i];
     }
     return max;
}

先处理特殊情况n<2。之后对数组直接排序,然后遍历数组相减存在max中,遍历完就可以得到最大的间距了。

5,905. 按奇偶排序数组 - 力扣(LeetCode) (leetcode-cn.com)

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sortArrayByParity(int* nums, int numsSize, int* returnSize)
{
    int* ret=(int*)malloc(sizeof(int)*numsSize);
    int k=0;
    int j=numsSize-1;
    int i=0;
     for(i=0;i<numsSize;i++)
     {
         if(nums[i]%2==0)
         {
           ret[k]=nums[i];
           k++;
         }
         else
         {
            ret[j]=nums[i];
            j--;
         }
     }
    *returnSize=numsSize;
    return ret;
}

因为只要奇数在偶数之后即可,那我们就遍历数组看每个元素是什么,判断其奇偶,偶数从0开始往后放,奇数从最后一个位置开始往前放。

6,539. 最小时间差 - 力扣(LeetCode) (leetcode-cn.com)

int findMinDifference(char ** timePoints, int timePointsSize)
{
        int i=0;
        int min=abs((((timePoints[0][0]-'0')*10)+(timePoints[0][1]-'0'))*60+(timePoints[0][3]-'0')*10+(timePoints[0][4]-'0')-(((timePoints[1][0]-'0')*10)+(timePoints[1][1]-'0'))*60-(timePoints[1][3]-'0')*10-(timePoints[1][4]-'0'));
        printf("%d",min);
        for(i=0;i<timePointsSize;i++)
        {
            int j=0;
            for(j=0;j<timePointsSize;j++)
            {
                if(j==i)
                continue;
                int dic;
                    if(abs(((timePoints[i][0]-'0')*10+timePoints[i][1]-'0')-((timePoints[j][0]-'0')*10+timePoints[j][1]-'0'))>12)
                          {
                             dic=abs((((timePoints[i][0]-'0'+2)*10)+(timePoints[i][1]-'0'+4))*60+(timePoints[i][3]-'0')*10+(timePoints[i][4]-'0')-(((timePoints[j][0]-'0')*10)+(timePoints[j][1]-'0'))*60-(timePoints[j][3]-'0')*10-(timePoints[j][4]-'0'));
                          }
                    else
                     dic=abs((((timePoints[i][0]-'0')*10)+(timePoints[i][1]-'0'))*60+(timePoints[i][3]-'0')*10+(timePoints[i][4]-'0')-(((timePoints[j][0]-'0')*10)+(timePoints[j][1]-'0'))*60-(timePoints[j][3]-'0')*10-(timePoints[j][4]-'0'));
                
                // else
                //  dic=abs((((timePoints[i][0]-'0')*10)+(timePoints[i][1]-'0'))*60+(timePoints[i][3]-'0')*10+(timePoints[i][4]-'0')-(((timePoints[j][0]-'0')*10)+(timePoints[j][1]-'0'))*60-(timePoints[j][3]-'0')*10-(timePoints[j][4]-'0'));
           if(min>dic)
            {
            min=dic;
            }
            }
            }
       return min;
}

这个就不说什么了,代码比较乱。思路就是全转成分钟再比较。

7,976. 三角形的最大周长 - 力扣(LeetCode) (leetcode-cn.com)

int cmp(const void*e1,const void*e2)
{
    if(*(int*)e1<=*(int*)e2)
    return 1;
    else
    return 0;
}
int largestPerimeter(int* nums, int numsSize)
{
     qsort(nums,numsSize,sizeof(int),cmp);
     int i;
     for(i=0;i<numsSize-2;i++)
     {
        if(nums[i+2]+nums[i+1]>nums[i])
        return nums[i]+nums[i+1]+nums[i+2];
     }
     return 0;
}

主要是贪心的思想。先由大到小排序,让最大数(当前,也就是nums【i】)前两个数相加,如果大于它,那么这三个数相加就是最大的三角形周长。而如果小于或者等于,其他数都比这两个数来得小,加起来肯定也不能大于nums【i】也就是这个数不能作为三角形一边。

8,881. 救生艇 - 力扣(LeetCode) (leetcode-cn.com)

int cmp(const void*e1,const void*e2)
{
    if(*(int*)e1<=*(int*)e2)
        return 1;
        else
        return 0;
}
int numRescueBoats(int* people, int peopleSize, int limit)
{
    qsort(people,peopleSize,sizeof(int),cmp);
    printf("%d",people[0]);
    int count=0;
    int left=0;
    int right=peopleSize-1;
    for(;left<right;)
    {
       if(people[left]+people[right]<=limit)
         {
             count++;
             left++;
             right--;
         }
       else
       {
           count++;
           left++;
       }
    }
    if(left==right)
    count++;
    return count;
}

也是贪心的思想,和上一题差不多。先由大到小排序,如果最重的一个人(当前)不能和最轻的一个人(当前)一起走,那么最重的那个人谁也不能一起走,只能自己乘一船。然后最重的人就变成了第二重的人,再进行比较。如此循环直到载完。

三,总结

万人千题,每天写题,争取早日达到千题目标。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-15 18:33:00  更:2021-12-15 18:33:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 16:53:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码