题目要求:
- 2n个数字,其中n个是重复的,剩下的都不一样
- 数字排列全无顺序
- 不允许申请O(n)以上的空间
int MajorityElement(int a[], int n)
{
int count = 1;
int current = 0;
for(int i = 1; i < n; i++){
if(a[current] == a[i])
count++;
else
count--;
if(count == 0){
current = i;
count = 1;
}
}
int currentCount = 0;
for(int i = 0; i < n; i++)
if(a[i] == a[current])
currentCount++;
if(2*currentCount > n)
return a[current];
else
return -1;
}
int Half(int a[], int n)
{
int m = MajorityElement(a, n-1);
if(m != -1)
return m;
else
return a[n-1];
}
该算法利用了一个经典问题的解法:在一个数组中查找出现次数最多的元素。时间复杂度为O(n)。