LeetCode 1287.有序数组中出现次数超过25%的元素
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
示例:
输入:arr = [1,2,2,6,6,6,6,7,10]
输出:6
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
由于数组是有序的,我们只需检查25%位置的元素是否是答案即可,我们可以二分查找25%位置的元素的第一次出现的位置,然后看是否占比25%即可:
class Solution {
public:int findSpecialInteger(vector<int>& arr) {int gap = arr.size() / 4 + 1;for (int i = 1; i < 3; ++i) {// 25%位置的元素首次出现的下标int lIdx = lowerBound(arr, arr[gap * i - 1]);// 往后数25%的下标,看是否还是该元素值if (arr[lIdx + gap - 1] == arr[lIdx]) {return arr[lIdx];}}return arr[gap * 3 - 1];}int lowerBound(vector<int> &arr, int target) {int l = 0;int r = arr.size() - 1;int ans = arr.size();while (l <= r) {int m = l + (r - l) / 2;if (arr[m] >= target) {ans = m;r = m - 1;} else {l = m + 1;}}return ans;}
};
如果arr的长度为n,则此算法时间复杂度为O(logn),空间复杂度为O(1)。