一开始觉得寻找中位数的方法已经很不错了,后来又发现了一个更加简单的方法,果然大家都很厉害呢,集思广益,可以从大家这里学到很多考虑问题的方法。
下面这些都是摘抄大家的回答,和我自己的实现。
题目:
已知有一个数组Array[N],其中有一个元素在数组中出现的次数超过了N/2次,请找出这个元素,要求时间复杂度为O(n)。
算法思想:
方法1. 寻找中位数,这个就不详说了
方法2. 如果删去原序列中的两个不同元素,则原序列中的主元素仍然在剩下的序列中 。
实现:
只许要每次如果遇到和暂时预定的结果是同一个数的话就计数加1。
否则计数减1。。 如果计数减到0的话说明前面的数有相同的和不同的数相同的数目
所以在这里可以当一个新的开始。。把下个数当新的预定数。。 直到最后那个数
如果降到0这个点上的话就可以把这个点当作新的起点。
这个方法可行性是基于相同数超过n/2这个基础上的