数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字:

这里讲解一个从数组特点找出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记录的数一定是出现次数最多的数,最后还要检查下到底该数的次数是否超过了数组长度的一半。因为可能数组中的数一个数字的次数都没有超过一半,当然这是一种异常情况处理

posted @ 2013-03-07 13:27  没离开过  阅读(138)  评论(0编辑  收藏  举报