《剑指offer》数字在排序数组中出现的次数
2015-09-12 15:59
501 查看
【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】
题目链接:http://www.nowcoder.com/practice/70610bf967994b22bb1c26f9ae901fa2?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
题目描述
统计一个数字在排序数组中出现的次数
思路
因为数组是排好序的,所以我们可以通过二分来找到第一个k和最后一个k,那么数组中一共有多少个k就很容易求出来了
class Solution
{
public:
int GetNumberOfK(vector<int> data ,int k)
{
int len = data.size();
if(len==0)
return 0;
int l = GetFirstK(data,len,k,0,len-1);
int r = GetLastK(data,len,k,0,len-1);
if(l>-1 && r>-1)
return r-l+1;
return 0;
}
int GetFirstK(vector<int> data,int len,int k,int start,int end)
{
if(start>end)
return -1;
int midIndex = (start+end)/2;
int midData = data[midIndex];
if(midData==k)
{
if(midIndex==0 || (midIndex>0 && data[midIndex-1]!=k))
return midIndex;
else
end = midIndex-1;
}
else if(midData>k)
end = midIndex-1;
else
start = midIndex+1;
return GetFirstK(data,len,k,start,end);
}
int GetLastK(vector<int> data,int len,int k,int start,int end)
{
if(start>end)
return -1;
int midIndex = (start+end)/2;
int midData = data[midIndex];
if(midData==k)
{
if(midIndex==len-1 || (midIndex<len-1 && data[midIndex+1]!=k))
return midIndex;
else
start = midIndex+1;
}
else if(midData<k)
start = midIndex+1;
else
end = midIndex-1;
return GetLastK(data,len,k,start,end);
}
};
相关文章推荐
- jQuery二级联动动态列表
- Json的知识点全解析,解析json数据的好工具大全
- jsp页面是放在webroot目录下和web-inf下优缺点
- JS实现超精简响应鼠标显示二级菜单代码
- Effective C++ 条款48 认识template元编程
- JS+CSS实现的简单折叠展开多级菜单效果
- JS对象之间的关系
- LeetCode 237 : Delete Node in a Linked List
- H5 限制input只能输入数字
- Jquery中的$().each,$.each的区别
- js学习笔记(三)数据类型转换
- javascript面向对象开发(一)
- 《剑指offer》数组中的逆序对
- [leetcode] Remove Nth Node From End of List
- 纯CSS实现漂亮的下拉导航效果代码
- css实现六边形
- jQuery实现select多选框左右添加,包括双击事件
- css居中方式总结
- CSS学习笔记----CSS3自定义字体图标
- phantomjs rendering