问题描述:
在编程之美中有这样一个问题:如何找出数组或其它连续存储空间中某个关键字出现次数大于总数一半的那个值。对于这个问题解决办法较多,现在将部分方法罗列如下。
1,可以采用哈希表法,即将其进行哈希运算,在对统计次数排序,再找出其中出现次数最多的那个。
2,编程之美中所提出的缩小规模算法。即每次去掉两个不相同的值,则剩下的那些数出现次数超过一半的数与缩小前不变。
这样就可以将将数据缩小在一个很小的范围内解决(经典)。
3,运用计数器进行解决(这种办法空间和时间复杂度都很好)下面将其解法贴出。为了解决方便我们以数组为例.
int find (int a[], int len)
{
int temp;
int i;
temp = a[0];
int count = 1;
for(i = 1;i < len; i++)
{
if(temp == a[i])
count++;
else
count--;
if(count==0)
{
temp = a[i];
count=1;
}
}
return temp;
}