题目描述

统计一个数字在排序数组中出现的次数。

分析:数组有序,采用二分查找无疑

两种方法,时间复杂度差不多,都是利用二分查找,不过统计k出现的次数有所不同而已

方法1:二分查找k,找到任意一个k的下标index,index向两边扩展即可

方法2:二分查找k+0.5和k-0.5的插入位置index1和index2,因为数组元素都是整数,index1-index2就是k出现的次数

时间复杂度:O(log N)

方法1:

int GetNumberOfK(vector<int> v ,int k)
{
if(v.size()==0)
return 0; //查找任意一个k的位置index
int low=0;
int high=v.size()-1;
int index=-1;
while(low<=high)
{
int mid=(low+high)/2;
if(v[mid]==k)
{
index=mid;
break;
}
else if(v[mid]>k)
{
high=mid-1;
}
else if(v[mid]<k)
{
low=mid+1;
}
}
if(index==-1)
return 0; //index向两边扩展
int c=0;
for(int i=index-1; i>=0; i--)
{
if(v[i]==k)
c++;
else
break;
}
int n=v.size();
for(int i=index+1; i<n; i++)
{
if(v[i]==k)
c++;
else
break;
}
return c+1;
}

方法2:

//查找k的插入位置
int f(vector<int> &v,double k)
{
int low=0;
int high=v.size()-1;
while(low<=high)
{
int mid=(low+high)/2;
if(v[mid]>k)
{
high=mid-1;
}else if(v[mid]<k)
{
low=mid+1;
}
}
return low;
}
int GetNumberOfK(vector<int> v ,int k)
{
if(v.size()==0)
return 0;
int x=f(v,k+0.5);
int y=f(v,k-0.5);
if(x==-1||y==-1)
return 0;
//k+0.5和k+0.5的插入位置相减就是k出现次数
return x-y;
}

【剑指offer】数组在排序数组中出现的次数的更多相关文章

  1. 剑指Offer——数字在排序数组中出现的次数

    题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNu ...

  2. 用java刷剑指offer(数字在排序数组中出现的次数)

    题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 java代码 //看见有序就用二分法 public class Solution { public int GetNumberOfK(int ...

  3. 剑指offer——56在排序数组中查找数字

    题目描述 统计一个数字在排序数组中出现的次数.   题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...

  4. 剑指 Offer——数字在排序数组中出现的次数

    1. 题目 2. 解答 时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数. class Solution { public: int GetNumberOfK(v ...

  5. 剑指offer 数字在排序数组中出现的次数

    因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> ...

  6. 剑指Offer - 九度1348 - 数组中的逆序对

    剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...

  7. 剑指offer:二维数组中的查找

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  8. 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字

    剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...

  9. 剑指Offer - 九度1351 - 数组中只出现一次的数字

    剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...

  10. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

随机推荐

  1. Generative Adversarial Networks overview(2)

    Libo1575899134@outlook.com Libo (原创文章,转发请注明作者) 本文章会先从Gan的简单应用示例讲起,从三个方面问题以及解决思路覆盖25篇GAN论文,第二个大部分会进一步 ...

  2. AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas

    忘记网址了…… 问题: 分析思路与解决方法:

  3. space-cloud 支持多数据库多rest&& graphql web server

    space-cloud 是一个开源的类似hasura 的graphql 引擎,但是space-cloud 同时支持rest api,而且支持多数据库 基于golang 编写,功能看着很强大 参考图 功 ...

  4. bzoj1935: [Shoi2007]Tree 园丁的烦恼lowbit 离散化

    链接 bzoj 最好不要去luogu,数据太水 思路 一个询问转化成四个矩阵,求起点\((0,0)到(x,y)\)的矩阵 离线处理,离散化掉y,x不用离散. 一行一行的求,每次处理完一行之后下一行的贡 ...

  5. shell 字符串转数组

    #!/bin/bash string="hello,shell,split,test" #将,替换为空格 array=(${string//,/ }) for var in ${a ...

  6. Centos7.4下安装PHP7.2.2

    ###安装php 安装PHP前,请先安装apache.yum install -y libxml2 libxml2-devel openssl openssl-devel libcurl curl-d ...

  7. ImportError: cannot import name 'BaseDataset' from 'src.dataset'

    因为我进行了相互调用,我在父类中调用了子类. from src.dataset import BaseDataset class PSINSDataset(BaseDataset): from src ...

  8. 【转】linux sed命令

    转自:linux sed命令就是这么简单 参考:Linux三大剑客之sed:https://blog.csdn.net/solaraceboy/article/details/79272344 阅读目 ...

  9. 拷贝Maven依赖jar包到指定目录

    一.导出到默认目录 targed/dependency 从Maven项目中导出项目依赖的jar包:进入工程pom.xml 所在的目录下,执行如下命令: 1 mvn dependency:copy-de ...

  10. mac jq for json format

    mac jq #1.安装 brew install jq #2.创建文件 echo '{"name": "Ruby"}' > ./test.json #3 ...