剑指offer——56在排序数组中查找数字
2024-08-28 23:19:30
题目描述
统计一个数字在排序数组中出现的次数。
题解:
使用二分法找到数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;
}
};
最新文章
- JMeter专题系列(四)参数化
- SQL Lazy Spool Eager Spool
- C#连接Excel示例代码和驱动
- python内置函数 2
- [转]20个高级Java面试题汇总
- String的replaceAll方法中的正则表达式用法
- twisted的defer模式和线程池
- 非关系型数据库SequoiaDB虚拟机下应用初探
- JavaScript标准Selection操作
- 使用asp.net上传图片并且裁剪的方法
- Android 布局之DrawLayout
- 看个人思路吧,清晰的话就简单 CodeForces 271A - Beautiful Year
- CentOS 6.4 64位 源码编译hadoop 2.2.0
- nodejs----安装配置
- 7、JPA-映射-双向一对多
- TensorFlow卷积层-函数
- PHP 批量操作删除,支持单个删除
- HTML/CSS基础知识(三)
- FJUT 倒水(倒水问题)题解
- Jenkins入门-部署gitlab 项目(8)
热门文章
- libVEX学习
- Axon 3.0.x 框架简介官方文档
- echarts 视图自适应问题
- PHP中输出字符串(echo,print,printf,print_r和var_dump)的区别【转载】
- CentOS 7 配置SFTP
- leetcode.数组.769最多能完成排序的块-Java
- Linux环境安装Nginx步骤
- POJ-2888 Magic Bracelet(Burnside引理+矩阵优化+欧拉函数+逆元)
- 【javascript dom读书笔记】 第九章 CSS-DOM
- java笔试常见的选择题