题目描述:

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

思路分析:

1. 直观思路是直接遍历一遍,统计。复杂度也只要O(n)。

2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成。分别二分查找第一个k和最后一个k。具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回;否则即第一个k在前面,则右边界r左移,继续递归查找。对于最后一个k的查找思路类似。

代码:

思路二:

 class Solution {
public:
int GetFirstK(vector<int>data, int k, int l, int r)
{
if(l>r)
return -;
int mid = (l+r)/;
if(data[mid]>k)
{
r = mid-;
}
else if(data[mid]<k)
{
l = mid+;
}
else
{
if((mid> && data[mid-]!=k) || mid==)
return mid;
else
r = mid-;
}
return GetFirstK(data, k, l, r);
}
int GetLastK(vector<int>data, int k, int l, int r)
{
if(l>r) //递归出口
return -;
int mid = (l+r)/;
if(data[mid]>k)
{
r = mid - ;
}
else if(data[mid]<k)
{
l = mid + ;
}
else
{
if((mid<data.size()-&&data[mid+]!=k) || mid == data.size()- )
return mid;
else
l = mid+;
}
return GetLastK(data, k, l, r);
}
int GetNumberOfK(vector<int> data ,int k) {
if(data.size()<=)
return ;
int first = GetFirstK(data, k, , data.size()-);
int last = GetLastK(data, k, , data.size()-);
if(first==- && last ==-)
return ;
else
return last-first+;
}
};

最新文章

  1. 支付宝APP支付后台参数生成Java版(一)
  2. C# params关键字
  3. QtInternal 之 高效使用QString
  4. 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
  5. java堆栈 (转)
  6. 14_Response对象
  7. javascript中的一些基本方法收藏
  8. elasticsearch查询模板
  9. 入我新美大的Java后台开发面试题总结
  10. python_利用高阶函数实现剪枝函数
  11. PHP编程效率的20个要点--PHP技术教程分享
  12. Building QGIS from source - step by step(随笔3)
  13. eslint的安装与使用
  14. GitHub-标签管理
  15. JavaScript 深入了解对象中的属性
  16. Spring MVC之DispatcherServlet初始化详解
  17. jzoj P1163 生日派对灯
  18. opencv 中affine函数实现旋转和平移
  19. 【翻译】R 中的设计模式
  20. Microsoft.Exchange 发邮件

热门文章

  1. Appscan漏洞之已解密的登录请求
  2. 【重大更新】Qlik Sense September 2018重磅发布(附下载)
  3. docker动态修改端口映射(考虑生产环境)
  4. 使用flannel+canal实现k8s的NetworkPolicy
  5. CentOS Linux更改MySQL数据库目录位置
  6. 《TensorFlow2深度学习》学习笔记(二)手动搭建并测试简单神经网络(附mnist.npz下载方式)
  7. Codeforces D. Little Elephant and Interval(思维找规律数位dp)
  8. C#将文件转成16进制码流写入数据库存起来,访问的时候再还原成PDF文件。
  9. Alpha冲刺随笔八:第八天
  10. Spring框架:Controller和RestController区别