题目描述:

统计一个数字在排序数组中出现的次数。

分析:

二分变形。二分查找最左边和最右边k的位置,然后相减加一就是结果。

代码:

 class Solution {
public:
int GetNumberOfK(vector<int> data, int k) {
int dataSize = data.size();
if(dataSize == ) return ;
int firstK = GetPositionOfFirstK(data, k, , dataSize - );
if(firstK == -) return ; // k不存在
int lastK = GetPositionOfLastK(data, k, , dataSize - );
return lastK - firstK + ;
}
int GetPositionOfFirstK(vector<int> data, int k, int left, int right) { // 二分找最左的k的位置
int mid = (left + right) >> ;
while(left < right) {
if(data[mid] > k) {
right = mid - ;
} else if(data[mid] < k) {
left = mid + ;
} else {
if(data[left] != k) left++;
else return left;
right = mid;
}
mid = (left + right) >> ;
}
return data[mid] == k ? mid : -;
}
int GetPositionOfLastK(vector<int> data, int k, int left, int right) { // 二分找最右的k的位置
int mid = (left + right) >> ;
while(left < right) {
if(data[mid] < k) {
left = mid + ;
} else if(data[mid] > k) {
right = mid - ;
} else {
if(data[right] != k) right--;
else return right;
left = mid;
}
mid = (left + right) >> ;
}
return data[mid] == k ? mid : -;
}
};

最新文章

  1. TODO:Linux安装PHP MongoDB驱动
  2. Reactjs的Controller View模式
  3. MFC编程入门之二十七(常用控件:图片控件PictureControl)
  4. PHPExcel读取Excel文件的实现代码
  5. bootstrap日期控件在火狐下的模态框中选择时间下拉菜单无效的解决办法
  6. mysql基本sql语句大全(提升用语篇)
  7. MSBuild和Jenkins搭建持续集成环境
  8. AJAX请求也会重新刷新整个页面?
  9. Docker 监控实战
  10. PHP微信公众号 access_token缓存
  11. 关于android:focusable属性
  12. 例10-3 uva10375(唯一分解定理)
  13. Quartz学习--二 Hello Quartz! 和源码分析
  14. Day 4 变量常量
  15. iPhone内存溢出——黑白苹果
  16. quartz.net的使用
  17. ppt点击文字出现图片,再次点击消失
  18. windows下使用mongodb
  19. bzoj 3685: 普通van Emde Boas树
  20. 遍历Map集合四中方法

热门文章

  1. CMWAP上网补丁描述文件!!支持ios9
  2. 一款纯css3实现的发光屏幕旋转特效
  3. linux 串口 特殊字符
  4. Oracle拉出在sqlserver建表的语句
  5. thinkphp 命名规范
  6. ThinkPHP种where的使用(_logic and _complex)的使用实例
  7. Run time setting设置详解
  8. 编程之美 set 8 区间重合判断
  9. 【RF库测试】对出错的处理
  10. 内存泄露,GC相关