#T0086. 多数元素

0

多数元素

题目背景

质检员在流水线上抽检一批零件,每个零件都印有一个整数编号。质检员想知道:是否存在一种编号,在整批零件中出现的次数严格超过总数量的一半。如果存在,就把这个编号上报;如果不存在,则上报 NO

题目描述

给定 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n

如果某个整数在序列中出现的次数严格大于 n2\dfrac n2,请输出这个整数;否则输出 NO

可以证明,满足条件的整数至多只有一个。

输入格式

第一行一个整数 nn

第二行 nn 个整数 a1,a2,,ana_1,a_2,\dots,a_n

输出格式

一行。

若存在出现次数严格大于 n/2n/2 的数,输出该数;否则输出 NO(大写)。

样例输入1

7
2 2 1 3 2 2 5

样例输出1

2

样例输入2

6
4 4 2 2 3 3

样例输出2

NO

样例输入3(稍大,含负数与 0)

12
-5 7 -5 0 -5 -5 2 -5 -5 1 -5 -5

样例输出3

-5

样例解释3

5-5 出现 88 次,8>68>6,输出 5-5

数据范围与约定

  • 1n2000001\le n\le 200000
  • ai109|a_i|\le 10^9
  • 注意:出现恰好 n/2\lfloor n/2\rfloor 次不算超过一半,例如 n=6n=6 时出现 33 次应当输出 NO

提示

可以先想最简单的计数做法;再思考能否只用 O(1)O(1) 的额外空间完成——可以了解一下「摩尔投票」的思路:候选数与不同的数两两配对抵消,最后剩下的候选可能是答案,但必须再扫描一遍确认它的出现次数确实过半。