题目描述
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数。
样例
输入:arr = [1,2,2,6,6,6,6,7,10]
输出:6
限制
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
算法
(线性遍历) $O(n)$
- 按顺序依次从前向后遍历,每次和数组的上个位置进行比较。
- 如果比较的结果一样则计数器加 1;如果不一样则判断计数器是否大于了数组长度的 25%,如果不大于则重置计数器。
时间复杂度
- 仅遍历数组一次,故时间复杂度为 $O(n)$。
空间复杂度
- 仅使用常数的额外空间。
C++ 代码
class Solution {
public:
int findSpecialInteger(vector<int>& arr) {
int n = arr.size();
int cnt = 1, num = arr[0];
for (int i = 1; i < n; i++)
if (arr[i] == arr[i - 1]) {
cnt++;
} else {
if (cnt * 4 > n) {
return num;
}
cnt = 1;
num = arr[i];
}
return num;
}
};