【剑指offer】数组在排序数组中出现的次数
题目描述
统计一个数字在排序数组中出现的次数。
分析:数组有序,采用二分查找无疑
两种方法,时间复杂度差不多,都是利用二分查找,不过统计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】数组在排序数组中出现的次数的更多相关文章
- 剑指Offer——数字在排序数组中出现的次数
题目描述: 统计一个数字在排序数组中出现的次数. 分析: 二分变形.二分查找最左边和最右边k的位置,然后相减加一就是结果. 代码: class Solution { public: int GetNu ...
- 用java刷剑指offer(数字在排序数组中出现的次数)
题目描述 统计一个数字在排序数组中出现的次数. 牛客网链接 java代码 //看见有序就用二分法 public class Solution { public int GetNumberOfK(int ...
- 剑指offer——56在排序数组中查找数字
题目描述 统计一个数字在排序数组中出现的次数. 题解: 使用二分法找到数k然后向前找到第一个k,向后找到最后一个k,即可知道有几个k了 但一旦n个数都是k时,这个方法跟从头遍历没区别,都是O(N) ...
- 剑指 Offer——数字在排序数组中出现的次数
1. 题目 2. 解答 时间复杂度为 \(O(n)\) 的算法,顺序遍历数组,当该数字第一次出现时开始记录次数. class Solution { public: int GetNumberOfK(v ...
- 剑指offer 数字在排序数组中出现的次数
因为有序 所以用二分法,分别找到第一个k和最后一个k的下标.时间O(logN) class Solution { public: int GetNumberOfK(vector<int> ...
- 剑指Offer - 九度1348 - 数组中的逆序对
剑指Offer - 九度1348 - 数组中的逆序对2014-01-30 23:19 题目描述: 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个 ...
- 剑指offer:二维数组中的查找
目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...
- 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...
- 剑指Offer - 九度1351 - 数组中只出现一次的数字
剑指Offer - 九度1351 - 数组中只出现一次的数字2013-11-23 01:23 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. ...
- 剑指 Offer 04. 二维数组中的查找 (思维)
剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...
随机推荐
- 提交代码报错 error: failed to push some refs to
在本人想把本地的分支推送到远程仓库时,突然出现了错误提醒error: failed to push some refs to....心里一咯噔,推不上去这还得了,手比脑快地就去google了一下. 然 ...
- 参数化CSV Data Set config元件
参数化CSV Data Set config元件 CSV Data Set config可以从指定的文件(一般是文本文件)中一行一行地提取文本内容,根据分隔符拆解这一行内容并把内容与变量名对应上,然后 ...
- Wbbpack --3配置
Wbbpack --3配置 什么是webpack webpack 是一个现代 JavaScript 应用程序的静态模块打包(modulebundler)当 webpack 处理应用程序时,它会递归地构 ...
- flag&to do list¬e
没错,今天我要立几个看起来可能会倒的 flag 今天白天 早上除非有特殊情况,不许再看我的博客.不许再看我的qq空间.不许再跟别人聊闲话!!!☑已达成 今天早上一定要坚持做题,把昨天问老师的问题搞懂, ...
- js限制输入数字能输入小数点,js定义数组,js往数组中添加数据,js将字符型转为数字型,除法结果保留两位小数——js小测:计算比赛得分
一个朋友跟我说要去给某个比赛算分: 规则:去掉最低分最高分求平均分: 最近在学习大数据可视化——图谱,用到js一些东西,所以今天就用js练练 用到知识点: js限制输入数字能输入小数点,js定义数组, ...
- [POI2008]PER-Permutation
[POI2008]PER-Permutation 带重复的康托展开! 根本不需要中国剩余定理就可以A掉! 看完题面你会惊人地发现这好像一个康托展开!(显然是不同的啦) 首先我们来看康托展开这个东西在数 ...
- [Beta阶段]第五次Scrum Meeting
Scrum Meeting博客目录 [Beta阶段]第五次Scrum Meeting 基本信息 名称 时间 地点 时长 第五次Scrum Meeting 19/05/10 新主楼F座2楼 50min ...
- 论文阅读 | Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition
源地址 arXiv:1712.07465: Recurrent Attentional Reinforcement Learning for Multi-label Image Recognition ...
- tensorflow keras analysis
目录 Q: where is Sequential defined? Q: where is compile()? tensorflow keras analysis code from keras. ...
- row_number() over()分组排序功能 partition by 用于给结果集分组
select * from ( select row_number() over(partition by Gid order by Gid ASC) as RowN, * from( select ...