读书人

请问一道笔试题多谢

发布时间: 2012-04-07 17:31:51 作者: rapoo

请教一道笔试题,谢谢!
题目大概是这样的:
已知有一个数组Array[N],其中有一个元素在数组中出现的次数超过了N/2次,请找出这个元素,要求时间复杂度为O(n)。(不知道我有没有表达清楚。。。)

我对算法没怎么研究过,我能想到的方法都效率不高,请问大家有什么好方法没?谢谢~

[解决办法]
找中位数即可,O(n)的复杂度,看算法导论
[解决办法]
元素在数组中出现的次数超过了N/2次称之为主元素
算法基本思想:如果删去原序列中的两个不同元素,则原序列中的主元素仍然在剩下的序列中 。
见:http://cs2.scnu.edu.cn/alg_webcourse/kcln/2/6.htm
[解决办法]
汗 其实根本不用排序。。。只许要每次如果遇到和暂时预定的结果是同一个数的话就计数加1。
否则计数减1。。 如果计数减到0的话说明前面的数有相同的和不同的数相同的数目
所以在这里可以当一个新的开始。。把下个数当新的预定数。。 直到zuihou那个数


不知到怎么表达。。 设想一条曲线 每次遇到相同的数九往上爬一点 如果遇到不同的数
就往下降一点
[解决办法]
微软技术面试心得2.3
0(n)复杂度
[解决办法]
另外设置一个数组b[n]并把它初始化每个元素为0,然后设置i:1-n循环 b[array[i]]++;
然后找出b[n]中=N/2的那元素对应于array中的数就可以了,下班了说得有点模糊不好意思。。。

读书人网 >软件架构设计

热点推荐