给定一个具有N个元素的数组。我们知道这些元素之一至少重复N / 2次。
我们对其他元素一无所知。它们可能重复或可能是唯一的。
是否有办法找出单遍重复至少N / 2次或可能为O(N)的元素?
没有多余的空间可以使用。
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