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

116 阅读1分钟

「这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战」。

题目描述:

1287. 有序数组中出现次数超过25%的元素 - 力扣(LeetCode) (leetcode-cn.com)

给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。

请你找到并返回这个整数。

示例一

输入: arr = [1,2,2,6,6,6,6,7,10]
输出: 6

提示:

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

思路分析

遍历

由于数组 arr 本身是排好序的,那么相同的数在 arr 中也应该是连续出现的。

因此我们可以对数组进行遍历,同时统计每个数出现的次数。如果发现某个数出现的次数超过数组 arr 长度的 25%,那么这个数即为答案。

这里有个小细节,在计算数组 arr 长度的 25% 时,会涉及到浮点数。我们可以用整数运算 count * 4 > arr.length 代替浮点数运算 count > arr.length * 25%,减少精度误差。

优化:

还有一种思路,求出25%对应的出现次数,假设为 j,我们在遍历数组的同时只要比较当前位置 i 值和 i + j的值是否相等即可。

AC代码

class Solution {
    fun findSpecialInteger(arr: IntArray): Int {
        val n = arr.size
        var cur = arr[0]
        var cnt = 0
        for(i in 0..n) {
            if(arr[i] == cur) {
                ++cnt
                if(cnt * 4 > n) {
                    return cur
                }
            } else {
                cur = arr[i]
                cnt = 1
            }
        }

        return -1

    }
}
class Solution {
    fun findSpecialInteger(arr: IntArray): Int {
       val j = arr.size / 4
       for(i in 0..arr.size) {
           if(arr[i] == arr[i+j]) {
               return arr[i]
           }
       }
        return -1
    }
}

参考

有序数组中出现次数超过25%的元素 - 有序数组中出现次数超过25%的元素 - 力扣(LeetCode) (leetcode-cn.com)

利用有序数组特性求解 - 有序数组中出现次数超过25%的元素 - 力扣(LeetCode) (leetcode-cn.com)