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 };
  • 相关阅读:
    二维码生成代码
    部署javaweb项目到阿里云ecs(centos7)
    mysql基础知识
    IDEA快捷键快速补齐类和对象名
    Redis和elasticsearch
    在asp.net 项目的bin目录中使用子目录
    MVC项目引用备注
    OAuth相关备注
    手动安装windows的磁盘清理工具
    在CentOS上安装 MongoDB
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13171903.html
Copyright © 2011-2022 走看看