题目:

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

思路:

对二分查找进行改进,找到数字在数组中第一次出现和最后一次出现的位置,这样就得到它出现的次数。

以找第一次出现的位置为例:如果mid元素大于k,则在前半段找;如果小于k,则在后半段找;如果等于k,则要看mid的前一个元素是不是k,如果是,则在前半段找,如果不是,则这就是第一次出现的位置。

时间复杂度O(logn)。

代码:

  1. class Solution {
  2. public:
  3. int GetNumberOfK(vector<int> data ,int k) {
  4. if(data.size()<=) return ;//OMG!这里也是应该输出0
  5.  
  6. int first=GetFirstK(data,k,,data.size()-);
  7. int last=GetLastK(data,k,,data.size()-);
  8. if(first>= && last>=)
  9. {
  10. return last-first+;
  11. }
  12.  
  13. return ;//OMG!这里应该是0啊
  14. }
  15. private:
  16. int GetFirstK(const vector<int> &data, int k, int begin, int end)
  17. {
  18. if(begin< || end>=data.size() || begin>end) return -;
  19.  
  20. int res=-;
  21. int mid=begin+(end-begin)/;
  22. if(data[mid]>k)
  23. res=GetFirstK(data,k,begin,mid-);
  24. else if(data[mid]<k)
  25. res=GetFirstK(data,k,mid+,end);
  26. else
  27. {
  28. if(mid== || (mid> && data[mid-]!=k))
  29. res=mid;
  30. else
  31. res=GetFirstK(data,k,begin,mid-);
  32. }
  33.  
  34. return res;
  35. }
  36.  
  37. int GetLastK(const vector<int> &data, int k, int begin, int end)
  38. {
  39. if(begin< || end>=data.size() || begin>end) return -;
  40.  
  41. int res=-;
  42. int mid=begin+(end-begin)/;
  43. if(data[mid]>k)
  44. res=GetLastK(data,k,begin,mid-);
  45. else if(data[mid]<k)
  46. res=GetLastK(data,k,mid+,end);
  47. else
  48. {
  49. if(mid==data.size()- || (mid<data.size()- && data[mid+]!=k))
  50. res=mid;
  51. else
  52. res=GetLastK(data,k,mid+,end);
  53. }
  54. return res;//!!!忘了这一句,找了好长时间错误!!!
  55. }
  56. };

【剑指offer】面试题38:数字在排序数组中出现的次数的更多相关文章

  1. 【剑指offer】题目38 数字在排序数组中出现的次数

    思路: 应该是用二分查找分别找到该数字第一次和最后一次出现的位置,相减即可.O(logn) int findLeft(int a[], int n, int num) { , r = n - ; wh ...

  2. 剑指Offer - 九度1349 - 数字在排序数组中出现的次数

    剑指Offer - 九度1349 - 数字在排序数组中出现的次数2013-11-23 00:47 题目描述: 统计一个数字在排序数组中出现的次数. 输入: 每个测试案例包括两行: 第一行有1个整数n, ...

  3. 剑指offer(37)数字在排序数组中出现的次数。

    题目描述 统计一个数字在排序数组中出现的次数. 题目分析 这题用暴力解也可以过,不过面试官肯定期待更好的解法. 查找我们最熟悉的就是二分查找了,不过二分查找查找的数在数组中只有一个,我们这里却有很多个 ...

  4. 剑指offer三十七之数字在排序数组中出现的次数

    一.题目 统计一个数字在排序数组中出现的次数. 二.思路 解法一:遍历数组计数 解法二:考虑到时有序数组,所以采用分查找,找到第一个K 和 最后一个K的位置, 二者相减. 三.代码 解法一: publ ...

  5. 【剑指Offer】37、数字在排序数组中出现的次数

      题目描述:   统计一个数字在排序数组中出现的次数.例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于数字3在该数组中出现了4次,所以函数返回4.   解题思路:   既然输入的数 ...

  6. 剑指offer37:统计一个数字在排序数组中出现的次数

    1 题目描述 统计一个数字在排序数组中出现的次数. 2 思路和方法 (1)查找有序数组,首先考虑使用二分查找,使时间复杂度为O(log n).更改二分查找的条件,不断缩小区间,直到区间头和区间尾均为k ...

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

    题目描述 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5} 和数字3,输出4. 思路如下 1. 预估时间复杂度,最复杂情况是,顺序扫描,统计K出现的次数,时间复杂 ...

  8. 【Offer】[53-1] 【数字在排序数组中出现的次数】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 统计一个数字在排序数组中出现的次数.例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出 ...

  9. 剑指offer——面试题4:二维数组中的查找

    // 面试题4:二维数组中的查找 // 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按 // 照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个 // 整数 ...

  10. 剑指Offer面试题:2.二维数组中的查找

    一.题目:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

随机推荐

  1. V$、GV$、X$、V_$、GV_$之间的关系

    V$.GV$.X$.V_$.GV_$之间的关系 GV$:全局视图,针对多个实例环境. V$:针对某个实例的视图. X$:是GV$视图的数据来源,oracle内部表. GV_$:是GV$的同义词. V_ ...

  2. OpenSSL之PKey的EVP封装

    在Openssl中,非对称加密涉及到两个密钥.一个为公开的密钥(公钥),一个为非公开的密钥.而OpenSSL中非对称加密算法有RSA.DSA.ECC,他们的原理不同,因此其密钥结构不同.下面我们列出我 ...

  3. android 绘图

    在main.xml文件中代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout ...

  4. passwd-shadow文件

    [root@rusky /]# vi /etc/passwd root:x:::Redhat5:/root:/bin/bash rusky:x::::/home/rusky:/bin/bash 1.r ...

  5. 基本 XAML 语法指南

    我们介绍了 XAML 语法规则,以及用于描述 XAML 语法中存在的限制或选项的术语.当出现以下情况时你会发现本主题很有用:不熟悉 XAML 语言的使用,希望加强对术语或某些语法部分的理解,或者对 X ...

  6. [c#]asp.net开发微信公众平台(4)关注事件、用户记录、回复文本消息

    上一篇已经把所有消息封装且都各自有方法处理了,这篇从使用第一步——关注开始,  关注之后进行消息记录,同时回复文本消息给用户,关注方法:DoSub,另外新用户扫描带参数的二维码关注方法:DoCodeN ...

  7. 在OC中调用Swift类中定义delegate出现:Property 'delegate' not found on object of type ...

    找了许久没找到答案, 在下面的链接中, 我解决了这个问题: http://stackoverflow.com/questions/26366082/cannot-access-property-of- ...

  8. 指针 v.s. 引用

    对C++的指针总觉得和引用差不多,其实还是挺有差别的. 程序 先看一个小程序: ; int& ra = a; int* pa = &ra; printf("&a = ...

  9. KindleRSS推送服务器搭建

    参考http://xcode.so/2010/12/google-gae-rss-to-kindle/这篇文章 1.首先尝试在本机搭建服务器直接推送到kindle 需要使用到kindlereader这 ...

  10. Retinex processing for automatic image enhancement 翻译

    Retinex processing for automatic image enhancement 摘要: 最近六七年来,人们从新燃起了对Retinex computation的兴趣,特别是在它对图 ...