寻找长度为n数组中出现次数超过n/2的元素。
可以暴力枚举时间复杂度为O(n^2),可以排个序然后处理时间复杂度为O(n*lon(n)),主要花在排序上。
在元素较小的情况下可以哈希处理,空间复杂度为O(n),时间复杂度也为O(n)。但是题目并未说元素较小且较少,此时此法不妥,更通用的方法是只需设置一个变量记录元素次数,首次出现为1,下一个若相同计数器+1,否则-1,注意一些小细节,下面是代码:
#include<iostream>
#include<ctime>
using namespace std;
const int INF=1<<30;
const int MAXN=1000;
int init(int *pArray)
{
srand((unsigned)(clock()));
int n=rand()%MAXN;
int *hash=new int[n];
for(int i=0;i<n;i++)
pArray[i]=rand()%(10000);
int num=0,randNum=rand()%(10000);
memset(hash,0,n*sizeof(int));
while(num<=(n/2+1))
{
int id;
do{
id=rand()%n;
}while(hash[id]);
hash[id]=1;
pArray[id]=randNum;
num++;
}
delete []hash;
return n;
}
int findThatNumber(int *pArray,int n)
{
if(NULL==pArray||0==n)
return INF;
int num=0,result,i=0;
while(i<n)
{
if(0==num)
{
num++;
result=pArray[i];
}
else if(result==pArray[i])
num++;
else num--;
i++;
}
return result;
}
int main()
{
int array[MAXN]={1,3,5,7,3,6,3,3,3,3};
int n=10;
n=init(array);
for(int i=0;i<n;i++)
{
cout<<array[i]<<" ";
if(i&&0==i%10)
cout<<endl;
}
cout<<endl<<findThatNumber(array,n)<<endl;
system("pause");
return 0;
}