zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    vue 组件的封装
    原生tab选项卡
    vue 登录验证码
    input type=”file“ change事件只执行一次的问题
    Java容器解析系列(13) WeakHashMap详解
    Java容器解析系列(12) LinkedHashMap 详解
    Java容器解析系列(11) HashMap 详解
    Java泛型之自限定类型
    java Reference
    Thread类源码解析
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13171903.html
Copyright © 2011-2022 走看看