找出数组中出现次数超过一半的数
来源:互联网 发布:中国装束复原小组淘宝 编辑:程序博客网 时间:2024/05/17 15:20
分析:
最直接的方法,对数组中所有的数排序,然后再扫描一遍,统计各个数出现的次数。如果某个数出现的次数超过一半,则输出这个数。算法的时间复杂度是O(N * log2N + N)。
如果每次删除两个不同的数,那么,在剩下的数字里,超过一半的数的个数一样超过了50%。不断重复这个过程,最后剩下的即为所求。无需避免的排序,时间复杂度只为O(N)。
方法:
使用两个变量A和B,其中A存储某个数组中的数,B用来计数。开始时将B初始化为0。遍历数组,如果B=0,则令A等于当前数,令B等于1;如果当前数与A相同,则B=B+1;如果当前数与A不同,则令B=B-1。遍历结束时,A中的数就是要找的数。
这个算法的时间复杂度是O(n),空间复杂度为O(1)。
Type Find(Type* ID, int N){ Type candidate; int nTimes, i; for(i = nTimes = 0; i < N; i++) { if(nTimes == 0) { candidate = ID[i], nTimes = 1; } else { if(candidate == ID[i]) nTimes++; else nTimes--; } } return candidate;}
扩展:随着Tango的发展,管理员发现,“超级水王”没有了。统计结果表明,有3个发帖很多的ID,他们的发帖数目都超过了帖子总数目N的1/4。你能从发帖ID列表中快速找出他们的ID吗?
求解内容极其相似,相同的思路进行求解即可。同时删除4个不同的ID后,剩余数据中3个多数id仍然是多数ID。
上题只需要一个结果,而现在需要3个结果,上题用到的nTimes,也应改为3个计数器。现在我们需要3个变量来记录当前遍历过的3个不同的ID,而nTimes的3个元素分别对应当前遍历过的3个ID出现的个数。如果遍历中有某个ID不同于这3个当前ID,我们就判断当前3个ID是否有某个的nTimes为0,如果有,那这个新遍历的ID就取而代之,并赋1为它的遍历数(即nTimes减1),如果当前3个ID的nTimes皆不为0,则3个ID的nTimes皆减去1。
#include <iostream>using namespace std;int candidate[3];int count[3] = {0};int input[100];int num = 0;int main(){ cout<<"please input"<<endl; int t; while(cin>>t) { if (t == -1) break; input[num++] = t; } bool flag = false; for (int i = 0;i < num;i++) { flag = false; for (int j = 0;j < 3;j++) { if (count[j] == 0) { continue; } if (candidate[j] == input[i]) { count[j]++; flag = true; } } if (flag == true) { continue; } for (int j = 0;j < 3;j++) { if (count[j] == 0) { candidate[j] = input[i]; count[j]++; flag = true; break; } } if (flag == true) { continue; } for (int j = 0;j < 3;j++) { count[j]--; } } cout<<count[0]<<" "<<count[1]<<" "<<count[2]<<endl; cout<<candidate[0]<<" "<<candidate[1]<<" "<<candidate[2]<<endl;}
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 算法--找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出数组中出现次数超过一半的数
- 找出出现次数超过数组一半元素的数
- 找出数组出现次数超过一半的数
- 找出数组中出现次数超过数组长度一半的数
- 找出数组中出现次数超过长度一半的数字
- 找出数组中出现次数超过一半的数字--百度
- 找出数组中出现次数超过一半的数字
- apache的prefork和workder模式
- mysql连接时间太长解决方法
- 证书(一)原理
- 《KOF2002》“扯蛋”修改记录
- 大数据:大规模文件系统及map-reduce
- 找出数组中出现次数超过一半的数
- 快速排序与堆排序效率对比(TimeSpan计时)
- 爬虫学习笔记1--代码示例
- 大数据:数据流挖掘
- 使用BigDecimal完成小数点后的精确位数的四舍五入
- SHADOWMAP
- 我只是个程序员
- ASCIIMathML技术简介~
- Ubuntu10.10安装JAVA SDK 1.7