【剑指offer】题目38 数字在排序数组中出现的次数
思路:
应该是用二分查找分别找到该数字第一次和最后一次出现的位置,相减即可。O(logn)
int findLeft(int a[], int n, int num)
{
int l = , r = n - ;
while(l <= r)
{
int m = l + (r - l) / ;
if(a[m] == num) //与普通二分查找的区别在等于这里
{
if(m == || a[m - ] != num) //如果这是第一个数字或者它前面的数字不是num那么这个位置就是第一个num出现的位置
return m;
else //否则num在左半部分
r = m - ;
}
else if(a[m] < num)
{
l = m + ;
}
else
{
r = m - ;
}
}
return -; //没找到
} int findRight(int a[], int n, int num)
{
int l = , r = n - ;
while(l <= r)
{
int m = l + (r - l) / ;
if(a[m] == num)
{
if(m == n - || a[m + ] != num) ////如果这是最后一个数字或者它后面的数字不是num那么这个位置就是最后一个num出现的位置
return m;
else //否则 最后一个num在右半部分
l = m + ;
}
else if(a[m] < num)
{
l = m + ;
}
else
{
r = m - ;
}
}
return -; //没找到
} int times(int a[], int n, int num)
{
if(a == NULL) return ;
int l = findLeft(a, n, num);
int r = findRight(a, n, num);
return (l == - || r == -) ? : r - l + ;
} int main()
{
int a[] = {,,,,,,,};
int ans = times(a, , ); return ;
}
最开始写的是用普通二分查找找到一个指定数字再左右扩展,O(N)不好。
//O(N)解法 不好
int appearTimes(int a[], int n, int num)
{
int l = ;
int r = n - ;
int pos = -; //找到的num的下标
while(l <= r) //二分查找 找到一个num
{
int m = l + (r - l) / ;
if(a[m] == num)
{
pos = m;
break;
}
else if(a[m] < num)
l = m + ;
else
r = m - ;
}
if(pos == -) //没有该数字
return ; l = r = pos;
while(l >= && a[l] == num) //找左边界
l--;
while(r < n && a[r] == num) //找右边界
r++; return r - l - ;
}
【剑指offer】题目38 数字在排序数组中出现的次数的更多相关文章
- 剑指 offer set 16 数字在排序数组中出现的次数
总结 1. Leetcode 上有一道题, 求某一个数字在有序数组中出现的最左位置和最右位置, 而这道题就是那题的变形
- 剑指offer: 38 数字在排序数组中出现的次数
题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...
- 剑指Offer面试题:32.数字在排序数组中出现的次数
一.题目:数字在排序数组中出现的次数 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4. 二.解题思路 2 ...
- 【剑指Offer面试编程题】题目1349:数字在排序数组中出现的次数--九度OJ
题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n,表示数组的大小.1<=n <= 10^6. 第二行有n个整数,表示数组元素,每个元素均 ...
- 【剑指offer】面试题38:数字在排序数组中出现的次数
题目: 统计一个数字在排序数组中出现的次数. 思路: 对二分查找进行改进,找到数字在数组中第一次出现和最后一次出现的位置,这样就得到它出现的次数. 以找第一次出现的位置为例:如果mid元素大于k,则在 ...
- (剑指Offer)面试题38:数字在排序数组中出现的次数
题目: 统计一个数字在排序数组中出现的次数. 思路: 1.顺序遍历 顺序扫描一遍数组,统计该数字出现的次数. 时间复杂度:O(n) 2.二分查找 假设我们需要找的数字是k,那么就需要找到数组中的第一个 ...
- 【Java】 剑指offer(53-1) 数字在排序数组中出现的次数
正文 本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 统计一个数字在排序数组中出现的次数.例如输入排序数组{1, ...
- 剑指Offer - 九度1349 - 数字在排序数组中出现的次数
剑指Offer - 九度1349 - 数字在排序数组中出现的次数2013-11-23 00:47 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n, ...
- 剑指Offer(三十七):数字在排序数组中出现的次数
剑指Offer(三十七):数字在排序数组中出现的次数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.n ...
随机推荐
- 关于datagridview的一些操作
1.绑定datatable时,会显示出不需要显示的列可以加datagridview.AutoGenerateColumns = false; 2.如果datagridview的某列是数值型的,有小数, ...
- Http协议[Get和Post]详解
(2012-11-27 11:23:26) 标签: android http get post mars 分类: Android系列 访问url,需要连接网络.所以,首先应该添加Manifest权限: ...
- AppCan移动平台开发常见问题解答
在使用AppCan移动平台开发跨平台APP时,有开发者会遇到一些问题, 不急,跟笔者一起来聊一聊使用AppCan平台开发中常见问题的解答方法. 问1.正常是按照官网提供的4个iphone启动图尺寸来做 ...
- Convert Geometry data into a Geography data in MS SQL Server
DECLARE @geog GEOGRAPHY; DECLARE @geom GEOMETRY; ); SET @geom = @geom.MakeValid() --Force to valid g ...
- 部署ghost博客
wget https://ghost.org/zip/ghost-0.6.4.zip npm install --production NODE_ENV=production npm start &g ...
- netfilter
http://jingyan.baidu.com/article/642c9d3415d2c9644a46f7c6.html http://blog.csdn.net/zhangskd/article ...
- 获取 UIWebView中用户所点击的图片URL
在使用 UIWebView 的时候 (通常是阅读类的 App),会有点击图片放大的需求,那么可以通过设置 UIWebViewDelegate 来过滤请求,取出图片的 URL 这个方法的前提是 img ...
- iOS UI高级之网络编程(HTTP协议)
HTTP协议的概念 HTTP协议,Hyper Text Transfer Protocol (超文本传输协议)是用于从万维网服务器传送超文本到本地浏览器的传输协议,HTTP是一个应用层协议,由请求和响 ...
- opencv颜色识别代码分享
android 平台 opencv 实现颜色识别代码:http://www.eyesourcecode.com/thread-40682-1-1.htmlopencv的颜色识别简单实现的代码:http ...
- React + Reflux
React + Reflux 渲染性能优化原理 作者:ManfredHu 链接:http://www.manfredhu.com/2016/11/08/23-reactRenderingPrinc ...