C语言:找到数组中出现次数最多的元素

简介: C语言:找到数组中出现次数最多的元素

一、前言

前几天在leetcode刷题时遇到了这个需求,就来CSDN搜索解决方法。

逛了一大圈,发现最多的方法是:新建一个大小为原数组中最大值的数组(初始化为0),然后遍历原数组,例如遍历到元素a,那么新建数组nums[a]++。最终再遍历一次新建数组,就可以知道哪个元素出现次数最多,以及其出现次数。

先说说这种方法的弊端:

首先如果数组中的最大元素值很大,那么就要创建一个很大的数组,不说浪费空间的问题,问题是有没有这么大的一片连续空间,让我们去申请。

其次是这么长的数组,遍历的时间复杂度也相当高。

所以我个人认为这个方法其实并不可行。

二、我的方法

我自己想的一个方法,大家可以看看:

新建一个和原数组相同的数组Nums,并降序排序。设置度degree(即元素出现次数),默认大小为1(因为每个元素至少出现一次)。遍历数组Nums,如果某元素和其下一元素相等,则degree++,如果不相等,则degree重置为1。每遍历一个元素,都要取最大的degree。这样就能得到数组中出现最多次数元素的出现次数max。

int cmp(const void* e1, const void* e2)
{
  return *(int*)e1 - *(int*)e2;
}
//函数参数是要查找最多出现元素的数组以及该数组的大小
//int findShortestSubArray(int* nums, int numsSize) 
  int* Nums = (int*)malloc(sizeof(int) * numsSize);
    //拷贝原数组数据到新数组
  for (int i = 0; i < numsSize; i++)
  {
    Nums[i] = nums[i];
  }
  qsort(Nums, numsSize, sizeof(int), cmp);//升序排序新数组
  int degree = 1;//元素出现次数(度)
  int max = degree;//初始时,最大次数默认为1
    for (int i = 0; i < numsSize - 1; i++)
  {
    if (Nums[i] == Nums[i + 1])
    {
      degree++;
    }
    else
    {
      degree = 1;
    }
    max = (int)fmax(max, degree);//每遍历完一个元素,取最大的度
  }

得到元素最多出现的次数后,再次遍历数组Nums,如果某个元素的degree=max,说明该元素就是出现次数最多的元素。由于可能出现多个这样的元素,因此要设置一个最多出现元素的数组most,将所有最多出现次数的元素存储到这个数组中。

degree = 1;
  int* most = (int*)malloc(sizeof(int) * numsSize);
  memset(most, 0, sizeof(int) * numsSize);
  int mostsize = 0;
  for (int i = 0; i < numsSize - 1; i++)
  {
    if (Nums[i] == Nums[i + 1])
      degree++;
    else
      degree = 1;
    if (degree == max)
    {
      most[mostsize++] = Nums[i];
    }
  }

三、完整代码

int cmp(const void* e1, const void* e2)
{
    return *(int*)e1 - *(int*)e2;
}
int* find_mostnum(int* nums, int numsSize)
{
    int* Nums = (int*)malloc(sizeof(int) * numsSize);
    memcpy(Nums, nums, sizeof(numsSize) * numsSize);
    qsort(Nums, numsSize, sizeof(int), cmp);
    int degree = 1;
    int max = 0;
    for (int i = 0; i < numsSize - 1; i++)
    {
        if (Nums[i] == Nums[i + 1])
            degree++;
        else
            degree = 1;
        max = (int)fmax(max, degree);
    }
    degree = 1;
    int* ans = (int*)malloc(sizeof(int) * numsSize);
    memset(ans, 0, sizeof(int) * numsSize);
    int ansSize = 0;
    for (int i = 0; i < numsSize - 1; i++)
    {
        if (Nums[i] == Nums[i + 1])
            degree++;
        else
            degree = 1;
        if (degree == max)
            ans[ansSize++] = Nums[i];
    }
    return ans;
}
int main()
{
    int nums[] = { 1,2,2,3,1 };
    int* ret = find_mostnum(nums, 5);
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", ret[i]);
    }
    printf("\n");
    return 0;
}


目录
相关文章
|
26天前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
35 6
|
29天前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
1月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
1月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
1月前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
1月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
17 0
保姆式教学C语言——数组
|
1月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
24 1
|
1月前
|
C语言
顺序表数组法构建(C语言描述)
如何使用C语言通过数组方法构建有序顺序表,包括顺序表的创建、插入、删除和打印等。
18 2
|
1月前
|
存储 编译器 C语言
【C语言】数组(一维、二维数组的简单介绍)
【C语言】数组(一维、二维数组的简单介绍)
|
1月前
|
C语言
C语言数组
C语言数组
17 0