剑指offer:数字在排序数组中出现的次数
2024-09-03 11:29:18
题目描述:
统计一个数字在排序数组中出现的次数。
思路分析:
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+;
}
};
最新文章
- 支付宝APP支付后台参数生成Java版(一)
- C# params关键字
- QtInternal 之 高效使用QString
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
- java堆栈 (转)
- 14_Response对象
- javascript中的一些基本方法收藏
- elasticsearch查询模板
- 入我新美大的Java后台开发面试题总结
- python_利用高阶函数实现剪枝函数
- PHP编程效率的20个要点--PHP技术教程分享
- Building QGIS from source - step by step(随笔3)
- eslint的安装与使用
- GitHub-标签管理
- JavaScript 深入了解对象中的属性
- Spring MVC之DispatcherServlet初始化详解
- jzoj P1163 生日派对灯
- opencv 中affine函数实现旋转和平移
- 【翻译】R 中的设计模式
- Microsoft.Exchange 发邮件
热门文章
- Appscan漏洞之已解密的登录请求
- 【重大更新】Qlik Sense September 2018重磅发布(附下载)
- docker动态修改端口映射(考虑生产环境)
- 使用flannel+canal实现k8s的NetworkPolicy
- CentOS Linux更改MySQL数据库目录位置
- 《TensorFlow2深度学习》学习笔记(二)手动搭建并测试简单神经网络(附mnist.npz下载方式)
- Codeforces D. Little Elephant and Interval(思维找规律数位dp)
- C#将文件转成16进制码流写入数据库存起来,访问的时候再还原成PDF文件。
- Alpha冲刺随笔八:第八天
- Spring框架:Controller和RestController区别