码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-06-21 20:08:15      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:lin   tco   integer   stat   output   special   image   find   block   

题目来源于力扣(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);
}

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

标签:lin   tco   integer   stat   output   special   image   find   block   

原文地址:https://www.cnblogs.com/zhiyin1209/p/13173568.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!