1287. Element Appearing More Than 25% In Sorted Array

问题:

给定一个递增数组,求其中出现频率>25%的元素

Example 1:
Input: arr = [1,2,2,6,6,6,6,7,10]
Output: 6
 

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

  

解法一:

出现频率>1/4的话,这个元素可能在的位置即是:

整个数组 1/4,2/4,3/4 的位置上,

那么判断这3个数,出现的次数是否>1/4即可。

这里使用二分查找的下界函数lower_bound:找到第一个>=cand元素位置

上届函数upper_bound:找到第一个>cand元素的位置

这两个界之间的,即是cand的起始终点位置

在使用distance(start, end)来判断两位置的距离。

代码参考:

 1 class Solution {
 2 public:
 3     int findSpecialInteger(vector<int>& arr) {
 4         int N=arr.size();
 5         int candary[3]={arr[N/4],arr[N/2],arr[N*3/4]};
 6         for(int cand:candary){
 7             auto start=lower_bound(arr.begin(), arr.end(), cand);//arr中第一个>=cand的数的index
 8             auto end=upper_bound(arr.begin(), arr.end(), cand);//arr中第一个>cand的数的index
 9             int sz=distance(start, end);
10             if(sz*4>N) return cand;
11         }
12         return -1;
13     }
14 };

 

方法二:

从第0个元素开始判断,

i+1/4size 的元素是否还是自己,若是,则该值为所求。

否则,判断下一个元素。

一直到,size-1/4size的元素,若该元素还不是,

那么以后的元素也不可能出现超过1/4的频率了,也就不用再循环判断了。

代码参考:

 1 class Solution {
 2 public:
 3     int findSpecialInteger(vector<int>& arr) {
 4         int N=arr.size();
 5         for(int i=0; i<(N-N/4); i++){
 6             if(arr[i]==arr[i+N/4]) return arr[i];
 7         }
 8         return -1;
 9     }
10 };

 

posted @ 2020-06-21 11:49  habibah_chang  阅读(133)  评论(0编辑  收藏  举报