若存在这样的元素,其出现次数大于N/2,则其在数组中至少相邻出现一次。
设数组为a,若数组长度为偶数,比较a[i]和a[i+1](其中i=0,2,4...N-2),若相等,将a[i]加入新数组,比较完后,对新数组重复上述操作。最终数组中若留下一个数,则这个数可能为要求的majority number,若为空,则不存在majority number。
若数组长度为奇数,检查最后一个元素是否为要求的元素,若是,返回这个值,若不是,则这个元素可能在前N-1个数中,而N-1为偶数,所以可以按上面的操作处理。
#include <iostream>
using namespace std;
pair<bool,int> candidate(const int *a,int N)
{
if (N % 2)
{
int temp = a[N - 1];
int cnt = 0;
for (int i = 0; i < N; ++i)
{
if (temp == a[i])
++cnt;
}
if (cnt>N / 2)
return make_pair(true,temp);
return candidate(a, N - 1);
}
else
{
int *b = new int[N / 2];
int cur = 0;
for (int i = 0; i < N-1; i +=2)
{
if (a[i] == a[i + 1])
b[cur++] = a[i];
}
if (cur)
{
auto p=candidate(b, cur);
delete [] b;
return p;
}
delete [] b;
return make_pair(false, 0);
}
}
void majority(const int *a, int N)
{
auto p = candidate(a, N);
int cur = 0;
if (p.first)
{
for (int i = 0; i < N; ++i)
{
if (p.second == a[i])
++cur;
}
}
if (!p.first || cur <= N / 2)
cout << "There is no such element." << endl;
else
cout << "The majority element is " << p.second <<"."<<endl;
}
int main()
{
int a[] = {1,2,3,3,2,3,3,2};
majority(a, 8);
}