1287. 有序数组中出现次数超过25%的元素『简单』

题目来源于力扣(LeetCode

一、题目

1287. 有序数组中出现次数超过25%的元素

题目相关标签:数组

提示:

  • 1 <= arr.length <= 10^4
  • 0 <= arr[i] <= 10^5

二、解题思路

2.1 线性扫描

  1. 据题意:数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%,即该元素的出现次数大于数组长度 / 4

  2. 遍历数组,因数组元素是非递减的有序数组,记录每个元素出现的次数即可

  3. 某元素的出现次数大于数组长度 / 4 时,返回当前遍历元素

2.2 线性扫描——优化版

  1. 据题意:数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%,即该元素的出现次数大于数组长度 / 4

  2. 因数组元素是非递减的有序数组,则该元素一定是连续出现数组长度 / 4 次的

  3. 遍历数组,若当前遍历元素的索引加上数组长度 / 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);
}
posted @ 2020-06-21 18:53  知音12138  阅读(271)  评论(0编辑  收藏  举报