尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

算法分析--寻找多数元素

算法分析--寻找多数元素
📅 发布时间:2026/6/19 14:35:12

简介

  • 给出n个元素的数组,希望找出其中数量超过 n/2 的元素。注意是>,不是>=。
  • 题目保证一定有多数元素,但是这里给出了没找到多数元素的情况。
  • 时间复杂度O(n)

法一:遍历计数

  • 对每个出现的元素都遍历一遍,求出其次数。
  • 或者通过链表,在节点里面加上元素出现次数这个信息,寻找节点里面count最大的元素。

法二:排序取中

  • 相对于暴力的遍历,排序取中算法是在排序好的数组中取中间元素,这个元素一定是多数元素。
  • 但是有时候对数组进行排序也很麻烦。

法三:剔除元素

前情提要:在原序列剔除两个不同的元素,多数元素不变,还是原来那个。简单证明如下:

  • 假设多数元素个数为c,其他元素个数n-c;
  • 若剔除一个多数元素,一个其他元素,原来就满足c>n/2,与现在满足多数元素的条件 c-1>(n-2)/2 完全等价
  • 若剔除两个不同的其他元素,多数元素在新数组里面的数量优势还被放大了,更加满足多数元素的条件。
代码编写细节

删除这个操作在内存上是不好做的,我们用count这个变量来模拟删除操作。count是当前候选元素和其他元素的个数相减,也就是净个数。当等于0,就可以把前面的元素都舍弃。

// 递归,寻找多数元素的候选者
int candidate(int a[],int n,int start) {if(start>=n)return -9999;int i=start;     int c=a[start];  // 候选元素cint count =1;while(i<n-1 && count>0){ // 目前候选元素个数比较多(count>0),并且还没比较完所有的元素,继续循环。i++;if(a[i]==c)  count++;else  count--;}if(i==n-1) return c;else return candidate(a,n,i+1);
}

这个函数返回c或者-9999;但是实际上只要i遍历到了最后一个元素,即是他不是多数元素,他也会被返回。
image
所以我们再次验证:

int main(){int n;cin>>n;int a[n];for(int i=0;i<n;i++) cin>>a[i];int c=candidate(a,n,0);if(c==-9999) cout<<"没有多数元素";else{int count=0;for(int i=0;i<n;i++)if(a[i]==c) count++;if(count > (n/2) ) cout<<c;else cout<<"没有多数元素";}return 0;
}

以上两段拼起来就是完整代码,如下:

点击查看代码
#include<iostream>
using namespace std;
int candidate(int a[],int n,int start) {if(start>=n)return -9999;int i=start;     int c=a[start];  // 候选元素cint count =1;while(i<n-1 && count>0){ // 目前候选元素个数比较多(count>0),并且还没比较完所有的元素,继续循环。i++;if(a[i]==c)  count++;else  count--;}if(i==n-1) return c;else return candidate(a,n,i+1);
}
int main(){int n;cin>>n;int a[n];for(int i=0;i<n;i++) cin>>a[i];int c=candidate(a,n,0);if(c==-9999) cout<<"没有多数元素";else{int count=0;for(int i=0;i<n;i++)if(a[i]==c) count++;if(count > (n/2) ) cout<<c;else cout<<"没有多数元素";}return 0;
}

附:确保数组一定有多数元素的版本:

点击查看代码
#include<iostream>
using namespace std;
int candidate(int a[],int n,int start) {int i=start;     int c=a[start];  // 候选元素cint count =1;while(i<n-1 && count>0){ i++;if(a[i]==c)  count++;else  count--;}if(i==n-1 || count>0 ) return c;else return candidate(a,n,i+1);
}
int main(){int n;cin>>n;int a[n];for(int i=0;i<n;i++) cin>>a[i];int c=candidate(a,n,0);cout<<c;return 0;
}

相关新闻

  • 2025年冷水机厂家权威推荐榜:开放式冷水机/离心式冷水机/工业小型冷水机/水冷螺杆冷水机/风冷螺杆冷水机/螺杆式冷水机专业选购指南
  • C#中的 Span、fixed、多维数组
  • 2025年板材重型货架厂家推荐排行榜,重型仓储货架,仓库重型货架,阁楼式重型货架,定制重型货架公司精选!

最新新闻

  • 【MATLAB】从原始数据到专业图表:自动化处理与高级figure定制
  • GoodbyeDPI图形界面使用指南:轻松绕过网络限制
  • 20260327
  • 2026年6月上海黄金回收榜单,实地探店对比,卖金不亏完整教程 - 逸程
  • 2026年6月最新百达翡丽中国官方售后服务地址客服热线网点电话 - 速递信息
  • 郑州名表回收榜单:盘点口碑最好的几家店,附地址全收录指南 - 沉迷学习28

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号