题目描述
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
示例:
输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
NOTE:在这里就相当于在一个数组中找出一个元素的出现次数大于总元素的25%;
我们可以将这个数组的元素作为索引,出现次数作为数组值来构建一个新的数组,这就变成了在一个集合中快速判断一个元素是否出现-----使用哈希法
方法一:哈希表
完整代码:
class Solution {
public:
// 找到数组中出现次数超过四分之一的特殊整数
int findSpecialInteger(vector<int>& arr) {
// 因为 0 <= arr[i] <= 10^5
int hash[100001] = {0}; // 初始化一个数组用于计数
// 遍历数组,统计每个数字出现的次数
for(int i = 0; i < arr.size(); i++) {
hash[arr[i]]++;
}
// 遍历计数数组,找到出现次数超过四分之一的数字
for(int i = 0; i < 100001; i++) {
if(hash[i] > arr.size() * 0.25) {
// 找到了出现次数超过四分之一的特殊整数,直接返回
return i;
}
}
// 如果没有找到,返回 -1
return -1;
}
};
方法二:
从题目中可以发现,这个数组是有序的,非递减的,要判断是否出现一个元素的出现次数是否大于总元素个数的1/4,那么对于这个元素第一次出现的位置加上总元素的1/4必然还是它本身;
完整代码:
class Solution {
public:
// 找到数组中出现次数超过四分之一的特殊整数
int findSpecialInteger(vector<int>& arr) {
int cnt = arr.size() * 0.25; // 计算四分之一的数量
// 遍历数组,检查每个元素后四分之一位置是否与当前元素相同
for(int i = 0; i < arr.size(); i++) {
if(arr[i + cnt] == arr[i]) {
// 如果是,说明该元素出现次数超过四分之一,直接返回
return arr[i];
}
}
// 如果未找到,返回 -1
return -1;
}
};