1287. 有序数组中出现次数超过25%的元素『简单』
题目来源于力扣(LeetCode)
一、题目
题目相关标签:数组
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
二、解题思路
2.1 线性扫描
-
据题意:数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%,即该元素的出现次数大于数组长度 / 4
-
遍历数组,因数组元素是非递减的有序数组,记录每个元素出现的次数即可
-
当某元素的出现次数大于数组长度 / 4 时,返回当前遍历元素
2.2 线性扫描——优化版
-
据题意:数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%,即该元素的出现次数大于数组长度 / 4
-
因数组元素是非递减的有序数组,则该元素一定是连续出现数组长度 / 4 次的
-
遍历数组,若当前遍历元素的索引加上数组长度 / 4,两个索引上的元素相同时,说明当前遍历元素出现次数大于数组长度 / 4,即出现次数超过数组元素总数的 25%
三、代码实现
3.1 线性扫描
public static int findSpecialInteger(int[] arr) {
int maxCount = arr.length / 4;
int count = 1;
if (arr.length == 1) {
return arr[0];
}
for (int i = 1; i < arr.length; i++) {
if (arr[i] == arr[i - 1]) {
count++;
if (count > maxCount) {
return arr[i];
}
} else {
count = 1;
}
}
return arr[0];
}
3.2 线性扫描——优化版
public static int findSpecialInteger(int[] arr) {
int len = arr.length;
int limit = len / 4;
for (int i = 0; i < len; i++) {
int end = i + limit;
if (end < len && arr[i] == arr[end]) {
return arr[i];
}
}
return -1;
}
四、执行用时
4.1 线性扫描
4.2 线性扫描——优化版
五、部分测试用例
public static void main(String[] args) {
int[] arr = {1, 2, 2, 6, 6, 6, 6, 7, 10}; // output: 6(元素 6 出现次数为4,超过数组长度 9/4 = 2)
// int[] arr = {1, 2, 3, 3}; // output:3(元素 3 出现次数为2,超过数组长度 4/4 = 1)
int result = findSpecialInteger(arr);
System.out.println(result);
}