有序数组中出现次数超过25%的元素
给你一个非递减的 有序 整数数组,已知这个数组中恰好有一个整数,它的出现次数超过数组元素总数的 25%。
请你找到并返回这个整数
示例:
输入:arr = [1,2,2,6,6,6,6,7,10] 输出:6
提示:
1 <= arr.length <= 10^4
0 <= arr[i] <= 10^5
题目解析:
有序数组,找到其中出现次数大于数组长度1/4的数返回
解法思路:
解法一:因为数组有序,所以直接遍历一次用len变量记录每个数出现次数,如果大于1/4则返回,时间复杂度O(N)
解法二:将数组以25%为单位分为4个部分,因为有序,所以相同的数会连续出现,又因为题目说一定有一个数出现频率大于25 %,所以这4部分的三个连接点25%、50%、75%一定会有答案出现。所以我们检查这三个位置的数,比如n/4下标位置数为x,先找到最左边的x的下标为J然后查看arr[J+n/4]是否等于x),如果相等则x符合条件返回x,如果不相等,同样的方法判断下一个连接点n/4 *2 +1。如果两个节点都不是答案,题目保证一定有答案,则直接返回最后一个节点3*n/4+2的值.
代码:
class Solution {
public:int findSpecialInteger(vector<int>& arr) {int m=arr.size()/4;for(int i:{m,m*2+1}){int x=arr[i];int j=ranges::lower_bound(arr,x)-arr.begin();if(arr[j+m]==x){return x;}}return arr[3*m+2];}
};
注意三个节点下标值的计算