目:统计一个数字k在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,输出4次

方案一:扫描数组,记录第一个出现的k和最后一个k中间有多少个,时间复杂度为O(n)

方案二:由于数组是有序的,那么我们可以利用二分的思想,求出k在数组中的第一个位置和最后位置相减即可。时间复杂度为O(logN)

注意严格按照良好的C++编码风格

[cpp] view plaincopy
  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. using namespace std;
  6. //规定没有找到返回-1
  7. int GetFirstIndex(int *arrNum, int left, int right, int k){
  8. if(arrNum == NULL || left > right){
  9. return -1;
  10. }
  11. while(left <= right){
  12. int mid = (left+right)>>1;
  13. if(arrNum[mid] > k){
  14. right = mid-1;
  15. }
  16. else if(arrNum[mid] < k){
  17. left = mid+1;
  18. }
  19. else{
  20. if((mid > 0) && (arrNum[mid-1] == k)){
  21. right = mid-1;
  22. }
  23. else{
  24. return mid;
  25. }
  26. }
  27. }
  28. return -1;
  29. }
  30. //规定没有找到返回-1
  31. int GetLastIndex(int *arrNum, int left, int right, int k){
  32. if(arrNum == NULL || left > right){
  33. return -1;
  34. }
  35. while(left <= right){
  36. int mid = (left+right)>>1;
  37. if(arrNum[mid] > k){
  38. right = mid-1;
  39. }
  40. else if(arrNum[mid] < k){
  41. left = mid+1;
  42. }
  43. else{
  44. if((mid < right-1) && (arrNum[mid+1] == k)){
  45. left = mid+1;
  46. }
  47. else{
  48. return mid;
  49. }
  50. }
  51. }
  52. return -1;
  53. }
  54. int main(){
  55. int arrNum[] = {1,2,3,3,3,3,4,5};
  56. //求出第一个和最后一个位置
  57. int firstIndex = GetFirstIndex(arrNum, 0, 7, 3);
  58. int lastIndex = GetLastIndex(arrNum, 0, 7, 3);
  59. if(firstIndex != -1 && lastIndex != -1){
  60. cout<<(lastIndex-firstIndex+1)<<endl;
  61. }
  62. else{
  63. cout<<-1<<endl;
  64. }
  65. return 0;
  66. }

数字在数组中出现的次数相关推荐

  1. 算法--微软面试:指定数字在数组中出现的次数

    Q题目 在排序数组中,找出给定数字的出现次数,比如 [1, 2, 2, 2, 3] 中2的出现次数是3次. Answer解法 这道题要求出结果不难,但要求最有解的话,就需要花费一番功夫了.常见解法有如 ...

  2. 【剑指offer】Q38:数字在数组中出现的次数

    与折半查找是同一个模式,不同的是,在这里不在查找某个确定的值,而是查找确定值所在的上下边界. def getBounder(data, k, start, end, low_bound = False ...

  3. 剑指offer:数字在排序数组中出现的次数

    题目描述 统计一个数字在排序数组中出现的次数. 解题思路 暴力求解,没用到排序的已知条件. class Solution { public:int GetNumberOfK(vector<int ...

  4. 【剑指offer-Java版】38数字在排序数组中出现的次数

    数字在排序数组中出现的次数: 最简单粗暴的方法是O(n^2) 可能的解法可以采用二分,首先根据二分找到给定数字在数组中的位置,然后再左右二分,找到边界(第一个和最后一个),左右边界的差值就是出现次数 ...

  5. 面试题整理11 数字在排序数组中出现的次数

    <剑指offer>面试题38: 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在此数组中出现了4次,因此输出4. 分析:看到排 ...

  6. 【C语言】数字在排序数组中出现的次数(改动)

    //数字在排序数组中出现的次数(改动) //统计一个数字在排序数组中出现的次数.比如:排序数组{1,2,3,3,3.3,4,5}和数字3,因为3出现了4次,因此输出4. #include <st ...

  7. 剑指Offer(Java版):数字在排序数组中出现的次数

    2019独角兽企业重金招聘Python工程师标准>>> 题目:统计一个数字在排序数组中出现的次数.例如输入排序数组为 {1,2,3,3,,3,3,4,5}和数字3,由于3在这个数组中 ...

  8. 《剑指offer》-- 调整数组顺序使奇数位于偶数前面、顺时针打印矩阵、数字在排序数组中出现的次数

    一.调整数组顺序使奇数位于偶数前面: 1.题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之 ...

  9. 【剑指offer】数字在排序数组中出现的次数

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/27364557 题目描写叙述: 统计一个数字在排序数组中出现的次数. 输入: 每一个測试案例 ...

最新文章

  1. linux 增加 ip_conntrack_max 造成 内核内存问题
  2. 用python编制一个的类_常见面试题整理--Python概念篇
  3. java开发常见异常_最常见的Java异常及其对Java开发人员的评价
  4. 第十二届蓝桥杯A组省赛试题 I: 双向排序(Java)
  5. MySQL通过接口导入hive_利用Sqoop将MySQL数据导入Hive中
  6. 20162312 2016-2017-2《Java程序设计》课程总结
  7. C语言和数据结构_1
  8. Emacs下使用Stardict
  9. 佳博打印机如何设置热敏打印
  10. 使用百度图像识别时,提示错误“No address associated with hostname”
  11. Windows系统设置共享文件夹及访问共享文件夹
  12. 【随机算法梗概】遗传算法通俗的讲解案例~~
  13. 程序猿520python表白利器——丘比特之箭
  14. python爬虫(十七)12306案例
  15. 转置-置换-向量空间R
  16. ORAN专题系列-18:5G O-RAN FrontHaul前传接口互操作性测试规范IOT概述与总体架构
  17. Nature Metabolism I 衰老的单细胞组学研究进展及展望
  18. linux通过以太网线上网,开发板通过以太网卡的互联网连接尝试
  19. SmartPhone手机上查看QQ天气预报
  20. 安全狗php站点404,开启安全狗响应内容保护导致404返回200状态码的解决办法

热门文章

  1. 【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )
  2. 【TCP/IP 协议】 TCP/IP 基础
  3. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解
  4. I/O:OutputStream
  5. 进击的新版NavMesh系统:看我飞檐走壁
  6. Java(CS)请求分流
  7. 【转】每天一个linux命令(50):crontab命令
  8. (转)一个带自定义分页,排序功能的DATAGRID控件(公开源码)
  9. OpenGL透视投影函数gluPerspective的参数含义之解析(图示)
  10. 基于PyTorch的GAN框架TorchGAN:用架构级API轻松定制GAN项目