当前位置: 首页 > news >正文

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

简介

  • 给出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;
}
http://www.jsqmd.com/news/23517/

相关文章:

  • 2025年物流货架厂家权威推荐榜:重型货架/阁楼货架/自动化立库货架,专业设计与承重性能深度解析
  • 吴恩达深度学习课程一:神经网络和深度学习 第四周:深层神经网络的关键概念 课后作业和代码实践
  • 2025年天金冈货架厂家权威推荐榜:重型货架,阁楼货架,仓储货架,自动化立库货架专业制造商实力解析
  • Tlias系统实战
  • Launcher 桌面源码笔记二
  • 2025年定制多层重型货架厂家推荐排行榜,仓库货架,重型仓储货架,阁楼货架,立体库货架公司精选
  • 2025年定制钢平台货架厂家推荐排行榜,阁楼式钢平台货架,重型钢平台货架,仓储钢平台货架,定制钢平台货架公司精选
  • 2025年板材重型货架厂家推荐排行榜,重型仓储货架,仓库重型货架,阁楼式重型货架,定制重型货架公司精选!
  • 2025年10月离婚房产律师对比榜:五强权威排名
  • 2025年冷库重型货架厂家权威推荐榜:专业定制重型仓储货架,适用于低温冷库环境,提供耐用承重解决方案及批发采购指南
  • 2025年口碑好的公司注册代理记账外包
  • 2025年热门的目视化规划落地最新推荐榜单集团
  • 2025年定制纺织重型货架厂家推荐排行榜,仓库重型货架,工业重型货架,仓储重型货架,阁楼重型货架公司推荐
  • 2025年靠谱的工厂团餐配送最新推荐榜单品牌
  • 2025年比较好的布里斯班澳洲海外仓电话
  • 新概念1-第一课
  • 2025年热门的logo VI设计实力公司
  • 2025年定制轮胎重型货架厂家推荐排行榜:专业仓储解决方案与耐用性深度解析,工厂直供优质货架公司精选!
  • 2025年质量好的房屋检测鉴定用户好评榜
  • 2025年质量好的鲜香即食涪陵榨菜制造厂家
  • 2025年耐用的双相钢不锈钢焊管厂家推荐及选购指南
  • 2025年定制物流仓库货架厂家推荐排行榜,重型货架,阁楼货架,自动化立库货架,穿梭式货架公司精选
  • 2025年正规的称重地磅TOP品牌厂家排行榜
  • 2025年口碑好的云南房屋加固服务推荐
  • 2025年AGV重型货架厂家推荐排行榜:智能仓储自动化立体库,重型横梁式货架,窄巷道AGV货架系统源头企业精选
  • 2025年比较好的水渠成型机厂家最新热销排行
  • 高级语言程序第二次作业 - 102300317
  • 2025年热门的食品级贴体盒厂家推荐及采购指南
  • 吉利汽车携手阿里云函数计算,打造新一代 AI 座舱推理引擎
  • 2025年窄巷道货架厂家权威推荐榜:定制仓储解决方案专家,高效空间利用率与耐用性深度解析