点击这里查看题目
又是一道经典面试题,正常思路下,排序,取num[n/2]输出就行了,时间复杂度O(nlogn),不过这道题扎心了,应该是出现了100个以上的10^6的数字,所以排序找中值的做法会超时
经典题当然有经典的解决方法。那就是假设第一个值为主元素ans,对它进行计数,读入一个与ans相同的就+1,否则-1(思路就像是用一个主元素抵消一个非主元素,主元素的计数结果一定是正的),计数值<=0的时候刷新ans。从当前位置重新开始计数。
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int ans,cnt,tmp;
scanf("%d",&ans);
cnt=1;n--;
while(n--)
{
scanf("%d",&tmp);
if(ans==tmp)cnt++;else cnt--;
if(cnt==0)ans=tmp,cnt=1;
}
cout<<ans<<endl;
}
}