数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字:
这里讲解一个从数组特点找出O(n)的算法。数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他的所有数字出现次数的和还要多。
根据这个特点我们得到下面代码:
bool CheckMoreThanHalf(int * numbers, int length,int number) { int times =0; for(int i=0; i<length; ++i) { if( numbers[i] == number) times++; } bool isMoreThanHalf =true; if(times *2 <= length) { isMoreThanHalf = false; } return isMoreThanHalf; } int MoreThanHalfNum(int * number, int length) { if( number == NULL || length <=0) return 0; int result = number[0]; int times = 1; //记录数字出现的次数 for(int i=1; i< length; ++i) { if(times == 0 )//如果记录的数字的出现次数变为零,则记录当前的数字 { result = number[i]; times = 1; } if( number[i] == result ) //如果当前数字与记录数字相同,次数加一 { times ++; } else times --; } if(! CheckMoreThanHalf(number,length,result)) return 0; return result; }
因为根据上面特性,最后result记录的数一定是出现次数最多的数,最后还要检查下到底该数的次数是否超过了数组长度的一半。因为可能数组中的数一个数字的次数都没有超过一半,当然这是一种异常情况处理