1287. 有序数组中出现次数超过25%的元素
题目描述
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
示例:
输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
解法
方法一:遍历
我们从头开始遍历数组 $\textit{arr}$,对于每个元素 $\textit{arr}[i]$,我们检查 $\textit{arr}[i]$ 是否等于 $\textit{arr}[i + \left\lfloor \frac{n}{4} \right\rfloor]$,其中 $n$ 是数组的长度。如果等于,那么 $\textit{arr}[i]$ 就是我们要找的元素,直接返回即可。
时间复杂度 $O(n)$,其中 $n$ 是数组 $\textit{arr}$ 的长度。空间复杂度 $O(1)$。
Python3
class Solution:
def findSpecialInteger(self, arr: List[int]) -> int:
n = len(arr)
for i, x in enumerate(arr):
if x == arr[(i + (n >> 2))]:
return x
Java
class Solution {
public int findSpecialInteger(int[] arr) {
for (int i = 0;; ++i) {
if (arr[i] == (arr[i + (arr.length >> 2)])) {
return arr[i];
}
}
}
}
C++
class Solution {
public:
int findSpecialInteger(vector<int>& arr) {
for (int i = 0;; ++i) {
if (arr[i] == (arr[i + (arr.size() >> 2)])) {
return arr[i];
}
}
}
};
Go
func findSpecialInteger(arr []int) int {
for i := 0; ; i++ {
if arr[i] == arr[i+len(arr)/4] {
return arr[i]
}
}
}
TypeScript
function findSpecialInteger(arr: number[]): number {
const n = arr.length;
for (let i = 0; ; ++i) {
if (arr[i] === arr[i + (n >> 2)]) {
return arr[i];
}
}
}
JavaScript
/**
* @param {number[]} arr
* @return {number}
*/
var findSpecialInteger = function (arr) {
const n = arr.length;
for (let i = 0; ; ++i) {
if (arr[i] === arr[i + (n >> 2)]) {
return arr[i];
}
}
};
PHP
class Solution {
/**
* @param Integer[] $arr
* @return Integer
*/
function findSpecialInteger($arr) {
$n = count($arr);
for ($i = 0; ; ++$i) {
if ($arr[$i] == $arr[$i + ($n >> 2)]) {
return $arr[$i];
}
}
}
}