n个数,找出出现超过n/2的数

题目描述

总共换了n把枪,发现有一种武器的数量至少有n/2个

第一个数为数据组数n(n为奇数),接下来1行,n个整数,表示武器的编号,数据保证必定有这样一种枪,1≤n≤106+1。复杂度O(n)

解决思路

复杂度为O(n)就不能通过遍历,或者排序,找到出现次数最多的数。

方案:利用大于n/2这一点,若一个数出现次数是大于n/2的,则其他所有数出现次数是小于n/2。用一个signal标记当前的数,则这个数之前一定没有其他数出现超过一半。一直到最后一个数,都可以证明没有其他数超过一半。

#include<stdio.h>
#include<bits/stdc++.h>
using namespace std;
int n,a;
int main(){
int signal,count=1;
cin>>n;
cin>>a;
signal=a;
for(int i=1;i<n;i++){
cin>>a;
if(a==signal)
count++;
else if(a!=signal)
count--;
if(count<0){
signal=a;
count=1;
}

}
cout<<signal;
}

 

posted @ 2020-11-03 00:51  沐慕木七  阅读(332)  评论(0)    收藏  举报