标签:
在面试题中经常会出现这样一个题目,给一个数组,其中含有N个非负元素,让你求出数组中出现次数超过一半的数字。
看到这个问题我们首先想到的可能是暴力的解法,那就是将数组排个序,输出中间的元素就行了,因为如果出现次数超过一半的话排完序后中间的那个元素肯定是我们需要求的值。
这样做的话排序的时间复杂度一般来说是O(NlogN),那么有没有时间复杂度为n的算法呢?
答案当然是有的,有这样的一个算法,Majority Vote Algorithm,他是这样的做的:设置一个计数器count和保存最多元素的变量majority,
代码的简单实现如下:
public int Find_Majority(int [] array) { int major=0, count = 0; int i=0; while(i<array.length){ if(i==0){ major=array[0]; count=1; }else if(major==array[i]){ //如果数组扫描到的数和当前majority数相等。 count++; }else if(major!=array[i]&&count!=0){//如果数组扫描到的数和当前majority数不相等,且当前majority数的票数至少有一票。 count--; }else{ major=array[i]; } i++; } int tmp_count=0; for(int j=0;j<array.length;j++){ if(array[j]==major) tmp_count++; } if(tmp_count>=(array.length+1)/2) //检验majority数的票数是否超过了总票数的一半 return major; else return -1; }
多数投票算法(Majority Vote Algorithm)
标签:
原文地址:http://www.cnblogs.com/jfwu/p/5561567.html