- 此题为微软面试一百题中的一题。
- 用动态规划算法可以实现在线性时间内完成任务。
- 思路就是假设第一个元素就是要找的那个result元素。
- 最终这个元素出现的次数一定比其他所有元素出现的次数还多。
- 每次遍历到一个新元素的时候就将result的计数减少或者增加,或者更新result。
- 最终求出result。
代码和结果如下:
timer t;
int a[]={1,2,1,3,1,8,1,2,3,1,4,9,1,1,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};
vector<int> va(a,a+sizeof(a)/sizeof(int));
print(va.begin(),va.end());
cout<<"array size : "<<va.size()<<endl;
int count_more=1;
int result=va[0];
for (vector<int>::size_type i=1;i<va.size();i++)
{
if (a[i]==result)
{
++count_more;
}
else if (count_more==1)
{
result=a[i];
}
else
{
--count_more;
}
}
cout<<"more than half is : "<<result<<endl
<<count_more<<endl
<<"number of "<<result<<" is "<<count(va.begin(),va.end(),result)<<endl;
cout<<"time elapsed "<<t.elapsed()<<endl;