首页 > 其他 > 详细

找出数组中出现次数超过一半的元素

时间:2014-07-27 23:09:29      阅读:328      评论:0      收藏:0      [点我收藏+]

题目:找出数组中出现次数超过一半的元素

解法:每次删除数组中两个不同的元素,删除后,要查找的那个元素的个数仍然超过删除后的元素总数的一半

#include <stdio.h>

int half_number(int a[], int n)
{
    if( a == NULL || n <= 0 )
        return -1;

    int i, candidate;
    int times = 0;
    for( i=0; i<n; i++ )
    {
        if( times == 0 )
        {
            candidate = a[i];
            times = 1;
        }
        else if( a[i] == candidate )
            ++times;
        else
            --times;
    }
    return candidate;
}

int main(void)
{
    int a[] = {1,2,3,2,2,2,5,4,2};

    int result = half_number(a, 9);
    if( result != -1 )
        printf("%d\n", result);
    else
        printf("Error.\n");

    return 0;
}

 

该题的扩展:数组中有3个元素出现的次数都超过数组元素总数N的1/4, 找出这三个元素

解法:同上,但是每次删除4个互不相同的元素,处理上比上面的稍微麻烦

#include <stdio.h>

void find(int a[], int n)
{
    if( a==NULL || n<=3 )
    {
        printf("Error.\n");
        return ;
    }

    int i,j;
    int times[3] = {0,0,0}; // 3个candidate的计数
    int candidate[3] = {-1,-1,-1}; // 假设元素不可能是-1

    for( i=0; i<n; i++ )
    {
        if( times[0] == 0 && a[i] != candidate[1] && a[i] != candidate[2] ) // 第1个candidate目前空缺, 且当前元素a[i]不等于其他两个candidate时, 将该元素作为新的candidate
        {
            candidate[0] = a[i];
            times[0] = 1;
        }
        if( times[1] == 0 && a[i] != candidate[0] && a[i] != candidate[2] )
        {
            candidate[1] = a[i];
            times[1] = 1;
        }
        if( times[2] == 0 && a[i] != candidate[1] && a[i] != candidate[0] )
        {
            candidate[2] = a[i];
            times[2] = 1;
        }
        else if( a[i] == candidate[0] )
        {
            ++times[0];
        }
        else if( a[i] == candidate[1] )
        {
            ++times[1];
        }
        else if( a[i] == candidate[2] )
        {
            ++times[2];
        }
        else // 删除4个各不相同的数组元素, 删除后
        {
            --times[0];
            --times[1];
            --times[2];
        }
    }
    printf("%d %d %d\n",candidate[0],candidate[1],candidate[2]);
}

int main(void)
{
    int a[] = {5,1,1,3,8,1,3,1,4,1,7,1,2,9,2,3,2,3,2,3,2,3,2};
    find(a, 23);
    return 0;
}

 

bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣bubuko.com,布布扣

找出数组中出现次数超过一半的元素,布布扣,bubuko.com

找出数组中出现次数超过一半的元素

原文:http://www.cnblogs.com/DayByDay/p/3871834.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!