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;
    }

posted @ 2021-07-15 10:15  旺仔古李  阅读(38)  评论(0编辑  收藏  举报