太多年没接触了
写一个程序,在长度为N的整数型数组a[ ]中寻找出现至少(N/2+1)次的值,如果存在这样的值,例如,如果a[ ]数组由2,3,2,2,2,3,2,1构成,那么程序应该输出2,因为2出现了5次>N/2次。试着想一个办法,使实现这个功能的计算复杂度为线性(即O(N)),如果你想到一个简单的算法使它能在线性复杂度上实现,在a数组由1,2,3,4,5,。。。。直到N,等元素构成,这样情况下,你的算法要进行多少次比较才能够确定在这个数组中不存在符合条件的值
程序代码:#include <stdio.h>
void foo( const int a[], size_t n )
{
int candidate = 0;
size_t cnt = 0;
for( size_t i=0; i!=n; ++i )
{
if( a[i] == candidate )
++cnt;
else if( cnt < 1 )
candidate = a[i];
else
--cnt;
}
cnt = 0;
for( size_t i=0; i!=n; ++i )
{
if( a[i] == candidate )
++cnt;
}
if( cnt > n/2 )
printf( "the number is: %d\n", candidate );
else
puts( "nobody" );
}
int main( void )
{
int a[] = { 2, 3, 2, 2, 2, 3, 2, 1 };
foo( a, sizeof(a)/sizeof(*a) );
}