一尘不染

如何找到至少重复N / 2次的数组元素?

algorithm

给定一个具有N个元素的数组。我们知道这些元素之一至少重复N / 2次。

我们对其他元素一无所知。它们可能重复或可能是唯一的。

是否有办法找出单遍重复至少N / 2次或可能为O(N)的元素?

没有多余的空间可以使用。


阅读 247

收藏
2020-07-28

共1个答案

一尘不染

st0le回答了问题,但这是一个5分钟的实现:

#include <stdio.h>

#define SIZE 13

int boyerMoore(int arr[]) {
    int current_candidate = arr[0], counter = 0, i;
    for (i = 0; i < SIZE; ++i) {
        if (current_candidate == arr[i]) {
            ++counter;
            printf("candidate: %i, counter: %i\n",current_candidate,counter);
        } else if (counter == 0) {
            current_candidate = arr[i];
            ++counter;
            printf("candidate: %i, counter: %i\n",current_candidate,counter);
        } else {
            --counter;
            printf("candidate: %i, counter: %i\n",current_candidate,counter);
        }
    }
    return current_candidate;
}

int main() {
    int numbers[SIZE] = {5,5,5,3,3,1,1,3,3,3,1,3,3};
    printf("majority: %i\n", boyerMoore(numbers));
    return 0;
}

这是一个有趣的解释(至少比阅读本文更有趣):http : //userweb.cs.utexas.edu/~moore/best-
ideas/mjrty/index.html

2020-07-28