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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/element-appearing-more-than-25-in-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二分法查找右边界
1:因为是排序数组,所以可以直接跳跃查找,跳跃的步伐为 s = length>>2。
2:每次跳跃之后,索引坐标 i 和对应的值value = arr[i] 。
3:二分法在区间 [i , length - 1]中查找value值的有边界index。
4:若arr[index] == arr[index - s],则arr[index] 为所求。
5:若都不存在,则返回-1。
public int findSpecialInteger(int[] arr) { int len = arr.length; int s = len >> 2; if (arr[0] == arr[s]) { return arr[0]; } for (int i = s; i < len; i += s) { int index = find(arr, arr[i], i, Math.min(i + s, len - 1)); if (arr[index] == arr[i]) { return arr[i]; } index--; if (arr[index] == arr[index - s]) { return arr[index]; } } return -1; } private int find(int[] arr, int target, int st, int end) { while (st < end) { int m = st + ((end - st) >> 1); if (arr[m] > target) { end = m; } else { st = m + 1; } } return st; }