zoukankan      html  css  js  c++  java
  • 在数组中寻找主要元素

    来自:【数据结构与算法分析——C语言描述】练习2.19

    问题描述:

    大小为 N 的数组 A ,其主要元素是一个出现次数超过 N/2 的元素(从而这样的元素最多有一个)。例如,数组

    3,3,4,2,4,4,2,4,4 有一个主要元素4,而数组

    3,3,4,2,4,4,2,4 没有主要元素。

    题目给了一种递归的算法,不过不太理解。看了几位前辈的代码之后换了思路。下面是我的理解:

    第一步,寻找候选元素。遍历数组元素,获得第一个元素将其写入ele,标记为1;接下来访问下一元素,如果它与ele相等,标记+1,否则-1。当ele减小到0时,继续读入下一元素到ele,并将标记重设为1。继续下去,直到最后一个元素。此时,ele获得出现次数最多的元素。

    第二步,确定该元素是否主要元素。这个不难,用计数器统计该元素在数组中的出现次数count。如果count超过半个数组大小,该候选元素就是主要元素,返回即可;否则返回NOTFOUND。

    时间复杂度显然是O(N)。

    int findCandidate(const int A[], int N)
    {
        int i, mark, ele;
    
        mark = 0;
        for (i = 0; i < N; i++)
        {
            if (mark == 0)
            {
                mark = 1;
                ele = A[i];
            }
            else if (A[i] == ele)
                mark++;
            else
                mark--;
        }
        return ele;
    
    }
    
    int findMajority(const int A[], int N)
    {
        int ele, i, count;
    
        count = 0;
        ele = findCandidate(A, N);
        for (i = 0; i < N; i++)
        if (A[i] == ele)
            count++;
        if (count > N / 2)
            return ele;
        return NOTFOUND;    //NOTFOUND is -1
    }
  • 相关阅读:
    Vue-router笔记
    webpack及其配置
    高阶函数+组件化开发
    Es6语法+v-on参数相关+vue虚拟dom
    英语资源及其APP推荐
    Qt获取ip地址
    QT创建和使用动态链接库
    error C2664: “strcmp”: 不能将参数 1 从“WCHAR [260]”转换为“const char *”
    Vue|VUE router 导航重复点击报错的问题解决方案
    Vue|触发路由跳转
  • 原文地址:https://www.cnblogs.com/mingc/p/5901717.html
Copyright © 2011-2022 走看看