问题:
给定一个递增数组,求其中出现频率>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 };