【剑指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行号++,因为此时目标值一定位于当前行的下 ...
随机推荐
- Bomb Enemy
Description Given a 2D grid, each cell is either a wall 'W', an enemy 'E' or empty '0' (the number z ...
- Ribbon自带负载均衡策略
IRule这是所有负载均衡策略的父接口,里边的核心方法就是choose方法,用来选择一个服务实例. AbstractLoadBalancerRuleAbstractLoadBalancerRule是一 ...
- LeetCode 981. Time Based Key-Value Store
原题链接在这里:https://leetcode.com/problems/time-based-key-value-store/ 题目: Create a timebased key-value s ...
- Mac上安装Python3虚拟环境(VirtualEnv)教程
如果已经安装好pip3,那么执行命令安装virtualenv环境 pip3 install virtualenv 安装完成检测版本是否安装成功 virtualenv --version 创建新目录 M ...
- 第08组 Alpha冲刺(4/6)
队名:955 组长博客:https://www.cnblogs.com/cclong/p/11882079.html 作业博客:https://edu.cnblogs.com/campus/fzu/S ...
- 浅谈UDF并行
首先我们来看说明UDF并行流程的这个图 网格和求解数据分布和储存在计算节点(compute-node)处理器上,而对于GUI界面和主机(host)节点上不存储任何数据,主机节点将命令从GUI传递到0节 ...
- 多浏览器书签同步插件EverSync
有时上网时会遇到浏览器不能正常显示的问题.(比如我的火狐浏览器无法正确显示微信公众号管理后台,在chrome上可以正常显示),所以我的电脑里安装了chrome和firefox两个浏览器.但是时间长了, ...
- js转义问题
js转义问题有很多场景,比如常见的根据某个字符串删除或者修改以及将某字符串传递至某个页面. 今天以一个简单的示例代码为例: <html> <head> <meta htt ...
- vue中使用时间插件、vue使用laydate
<input id="time1" readonly="readonly" placeholder="这里选择时间" v-model= ...
- html上传文件限制、前端限制文件类型
<input id="file" type="file" accept=".xls,.xlsx" style="width: ...