题目描述

统计一个数字在排序数组中出现的次数。
 
题解:
  使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了
  但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N)的复杂度
  可以再次利用二分法,在第一次找到k的左半部分使用二分法找到不再出现k的位置,其右半部份类似。
  

 class Solution01 {
public:
int GetNumberOfK(vector<int> data, int k) {
if (data.size() == )return ;
int L = , R = data.size() - , M;
while (L <= R)
{
M = (R - L) / + L;
if (data[M] == k)break;
else if (data[M] > k)R = M - ;
else L = M + ;
}
if (L > R)return ;
L = R = M;
int res = ;
while (L >= && data[L] == k) {
res++; --L;
}
while (R<data.size() && data[R] == k) {
res++; ++R;
}
return res - ;
}
}; class Solution02 {
public:
int GetNumberOfK(vector<int> data, int k) {
if (data.size() == )return ;
int pM = find(data, , data.size() - , k);
if (data[pM] != k)return ;
int pL = pM, pR = pM;
while (pL !=- && data[pL] == k) pL = find(data, , pL - , k);
while (pR != - && data[pR] == k) pR = find(data, pR + , data.size() - , k);
return (pR == - ? data.size() : pR) - pL - ;
}
int find(const vector<int>data, int L, int R, const int k)
{
int M = -;
while (L >= && R < data.size() && L <= R)
{
M = (R - L) / + L;
if (data[M] == k)break;
else if (data[M] > k)R = M - ;
else L = M + ;
}
return M;
}
};

最新文章

  1. JMeter专题系列(四)参数化
  2. SQL Lazy Spool Eager Spool
  3. C#连接Excel示例代码和驱动
  4. python内置函数 2
  5. [转]20个高级Java面试题汇总
  6. String的replaceAll方法中的正则表达式用法
  7. twisted的defer模式和线程池
  8. 非关系型数据库SequoiaDB虚拟机下应用初探
  9. JavaScript标准Selection操作
  10. 使用asp.net上传图片并且裁剪的方法
  11. Android 布局之DrawLayout
  12. 看个人思路吧,清晰的话就简单 CodeForces 271A - Beautiful Year
  13. CentOS 6.4 64位 源码编译hadoop 2.2.0
  14. nodejs----安装配置
  15. 7、JPA-映射-双向一对多
  16. TensorFlow卷积层-函数
  17. PHP 批量操作删除,支持单个删除
  18. HTML/CSS基础知识(三)
  19. FJUT 倒水(倒水问题)题解
  20. Jenkins入门-部署gitlab 项目(8)

热门文章

  1. libVEX学习
  2. Axon 3.0.x 框架简介官方文档
  3. echarts 视图自适应问题
  4. PHP中输出字符串(echo,print,printf,print_r和var_dump)的区别【转载】
  5. CentOS 7 配置SFTP
  6. leetcode.数组.769最多能完成排序的块-Java
  7. Linux环境安装Nginx步骤
  8. POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
  9. 【javascript dom读书笔记】 第九章 CSS-DOM
  10. java笔试常见的选择题