每日一题——多数元素

简介: 每日一题——多数元素

多数元素

题目链接

方法一:暴力解法

直接利用两层循环,外层循环用来枚举数组的每一个元素,内层循环用来计算每个元素出现的次数,这样就可以求出多数元素了。

显然,这个方法的时间复杂度为O(N^2),效率太低。

int majorityElement(int* nums, int numsSize) {
  int max_index = 0;  //用来记录多数元素的下标
  int temp = 0; //用来统计每个元素出现的次数
  int max = 0;  //用来记录出现的最大次数
  for (int i = 0; i < numsSize; i++)
  {
    temp = 0; //每一次都是对一个新的元素记录,因此temp要置零
        //如果出现重复元素,那么就temp++
    for (int j = 0; j < numsSize; j++)
    {
      if (nums[i] == nums[j])
        temp++;
    }
        //如果temp大于最大次数,那么就更新多数元素下标,同时更新max
    if (temp > max)
    {
      max_index = i;
      max = temp;
    }
  }
    //返回多数元素
  return nums[max_index];
}

方法二:排序

先给出结论:如果一个有序数组中存在多数元素(出现次数大于n/2),那么下标为n / 2处的元素就是多数元素

下面通过画图来分析:

我们利用快速排序qsort来实现,时间复杂度为O(NlongN),效率有所提高,但仍无法满足题目要求

int compar(const void* num1, const void* num2)
{
    return *(int*)num1 - *(int*)num2;
}
int majorityElement(int* nums, int numsSize){
    //排序
    qsort(nums,numsSize,sizeof(int),compar);
    //返回多数元素
    return nums[numsSize/2];
}

(推荐)方法三:互拼法(Boyer-Moore 投票算法)

我们来举一个形象的例子来解释这个算法:

假设有100个士兵,由于多数元素必然大于n/2,那我们假设多数元素士兵为51个,其他元素士兵为49个,这100个士兵一起去占领一块高地(相同士兵共存,不同士兵相消)

  1. 第一个到来的士兵,直接插上自己阵营的旗帜占领这块高地,现存兵力 count = 1。
  2. 如果新来的士兵和前一个士兵是同一阵营,则集合起来占领高地,~~~~现存兵力 count++;
  3. 如果新来到的士兵不是同一阵营,则前方阵营派一个士兵和它同归于尽。 此时前方阵营兵力count --。
  4. 当下一个士兵到来,发现前方阵营已经没有兵力(双方死光),新士兵就成了领主,现存兵力 count ++。

就这样各路军阀一直以这种以一敌一同归于尽的方式厮杀下去,直到少数阵营都死光,那么最后剩下的几个必然属于多数阵营。(多数阵营 51个,少数阵营只有49个,死剩下的2个就是多数阵营的人)

这一题也一样,数组的第一个元素就是第一个士兵,,同时我们假设第一个元素就是要返回的多数元素temp,接下来遍历整个数组,如果遇到相同元素,那么count++,否则count--,如果count减为0,那么下一个元素就会成为多数元素,temp也要改变,最后遍历完数组得到的temp就是未被抵消的元素,即多数元素

这样,只需要遍历一遍数组,就可以得到想要的结果,时间复杂度为O(N)

int majorityElement(int* nums, int numsSize){
    int temp = nums[0];
    int count = 0;
    for(int i = 0; i < numsSize; i++)
    {
        if(temp == nums[i])
            count++;
        else
            count--;
        if(count == 0)
            temp = nums[i + 1];
    }
    return temp;
}
相关文章
|
Ubuntu Linux
Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
Win10 Ubuntu子系统(内嵌ubuntu18.04)运行32bit Linux原生程序 解决Exec format error错误
348 0
|
算法 Python
LightGBM高级教程:自动调参与超参数优化
LightGBM高级教程:自动调参与超参数优化【2月更文挑战第5天】
1835 2
|
4月前
|
人工智能 自然语言处理 Serverless
Vibecoding 新体验:实测 Qwen3 Coder 代码生成效果
Qwen3 Coder 是全球领先的开源编程大模型,具备强大的代码生成能力与1M超长上下文支持,适用于构建复杂应用。本文通过实际案例展示其在电商网站开发中的应用,并详解提示词设计、技术拆解与部署方案,探讨Agentic AI落地的挑战与经验。
1135 13
|
9月前
|
编解码 人工智能 测试技术
CogView4开源发布!智谱AI文生图模型支持任意长度双语输入,汉字生成能力突出,可商用!
今天智谱AI正式发布并开源了最新的图像生成模型——CogView4。
680 10
CogView4开源发布!智谱AI文生图模型支持任意长度双语输入,汉字生成能力突出,可商用!
|
9月前
|
人工智能 固态存储 iOS开发
5分钟搞定Photoshop 2025安装:官方下载+许可证激活避坑指南
Adobe Photoshop 2025 是 Adobe 公司推出的最新图像处理软件,广泛应用于平面设计、摄影后期和 UI 设计等领域。其核心功能包括智能 AI 工具(一键抠图、生成填充等)、高效工作流(优化图层管理与色彩调整)、跨平台兼容(支持 Windows 11 和 macOS 15)以及云协作功能(与 Adobe Creative Cloud 集成)。本文详细介绍软件的安装流程、系统要求、正版激活方法及常见问题解决方案,并提供扩展学习资源,帮助用户更好地掌握这款强大工具。
33160 3
|
安全 网络安全 数据安全/隐私保护
如何识别和防范网络诈骗?
识别和防范网络诈骗需要我们时刻保持警惕,仔细核实信息,保护好个人信息和财产安全,遇到可疑情况及时与相关机构或警方联系,共同打击网络诈骗行为。
907 13
|
传感器 算法 物联网
CCF推荐C类会议和期刊总结:(计算机网络领域)
该文档总结了中国计算机学会(CCF)推荐的计算机网络领域C类会议和期刊,详细列出了各类会议和期刊的全称、出版社、dblp文献网址及研究领域,为研究者提供了广泛的学术交流资源和平台。
CCF推荐C类会议和期刊总结:(计算机网络领域)
|
消息中间件 监控 安全
AMQP 安全性的最佳实践
【8月更文第28天】为了防止数据在传输过程中被窃听或篡改,推荐使用传输层安全 (TLS) 或安全套接字层 (SSL) 来加密通信。这可以通过在客户端和服务器之间建立一个安全通道来实现。
301 0
|
运维 监控 关系型数据库
CentOS7 离线安装 Zabbix5.0
各位运维的朋友们都有可能遇到过在公司内网环境下无法访问外网情况,无法访问外网yum源部署ZABBIX 对于rpm包依赖问题比较头疼。本文将会进行离线部署实战。同时大家也可以写成一份shell脚本直接离线安装一键部署就可以了。
2068 0
CentOS7 离线安装 Zabbix5.0
|
Web App开发 Windows