「这是我参与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^40 <= 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)