-作者:``SDLTF``
+author: SDLTF
## 概述
给一个有$n$个元素的数列,保证有一个数$a$出现的次数**超过**$50%$,求这个数。
-## 做法1:桶计数做法
+## 做法
+### 桶计数做法
桶计数做法是出现一个数,就把这个数出现次数+1,很好懂:
```cpp
for(int i = 0;i < n;i ++){
但是这个做法很浪费空间,我们不推荐使用。
-## 做法2:排序做法
+### 排序做法
显然,若一个数列存在主元素,那么这个主元素在排序后一定位于$\frac{n}{2}$的位置。
+
那么我们又有想法了:
```cpp
sort(a, a + n);
cout<<a[n / 2 - 1];//因为这里数组从0开始使用,所以需要-1
```
看起来不错!$O(N\log N)$的复杂度可还行?
+
但是,一旦有$N\log N$,就一定有人想出$N$的做法。有吗?还真的有——
-## 做法3:主元素数列的特性
+### 主元素数列的特性
由于主元素的出现的次数超过50%,那么在不断的消掉两个不同的元素之后,最后一定剩下主元素。
输入时判断与上一次保存的输入是否相同,如不同则删除两数,这里用栈来实现。