• 剑指Offer:找出数组中出现次数超过一半的元素


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

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

    #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
    ", result);
        else
            printf("Error.
    ");
    
        return 0;
    }

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

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

    #include <stdio.h>
    
    void find(int a[], int n)
    {
        if( a==NULL || n<=3 )
        {
            printf("Error.
    ");
            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
    ",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;
    }

  • 相关阅读:
    docker启动centos容器后如何用putty连接
    Nginx——静态资源服务器(一)
    在win10 docker启动的centos容器中安装nginx
    Spring简单实现数据源的动态切换
    fastjson将json字符串中时间戳转化为日期
    springmvc的异常统一处理
    检查性异常和非检查性异常的区别
    前端其他目录
    JavaScript目录
    React目录
  • 原文地址:https://www.cnblogs.com/DayByDay/p/3871834.html
Copyright © 2020-2023  润新知