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

Posted Fzu_LJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer:数字在排序数组中出现的次数相关的知识,希望对你有一定的参考价值。

题目描述:

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

 

思路分析:

1. 直观思路是直接遍历一遍,统计。复杂度也只要O(n)。

2. 显然这道题要考察的内容不这么简单,实际上考虑二分的思想来完成。分别二分查找第一个k和最后一个k。具体来说,利用二分查找思想,找到k,再判断当前的前一个是否为k或是否为第一个元素,若是,则返回;否则即第一个k在前面,则右边界r左移,继续递归查找。对于最后一个k的查找思路类似。

 

代码:

思路二:

 1 class Solution {
 2 public:
 3     int GetFirstK(vector<int>data, int k, int l, int r)
 4     {
 5         if(l>r)
 6             return -1;
 7         int mid = (l+r)/2;
 8         if(data[mid]>k)
 9         {
10             r = mid-1;
11         }
12         else if(data[mid]<k)
13         {
14             l = mid+1;
15         }
16         else
17         {
18             if((mid>0 && data[mid-1]!=k) || mid==0)
19                 return mid;
20             else
21                 r = mid-1;
22         }
23         return GetFirstK(data, k, l, r);
24     }
25     int GetLastK(vector<int>data, int k, int l, int r)
26     {
27         if(l>r)  //递归出口
28             return -1;
29         int mid = (l+r)/2;
30         if(data[mid]>k)
31         {
32             r = mid - 1;
33         }
34         else if(data[mid]<k)
35         {
36             l = mid + 1;
37         }
38         else
39         {
40             if((mid<data.size()-1&&data[mid+1]!=k) || mid == data.size()-1 )
41                 return mid;
42             else
43                 l = mid+1;
44         }
45         return GetLastK(data, k, l, r);
46     }
47     int GetNumberOfK(vector<int> data ,int k) {
48         if(data.size()<=0)
49             return 0;
50         int first = GetFirstK(data, k, 0, data.size()-1);
51         int last = GetLastK(data, k, 0, data.size()-1);
52         if(first==-1 && last ==-1)
53             return 0;
54         else
55             return last-first+1;
56     }
57 };

 

以上是关于剑指offer:数字在排序数组中出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer(二十七)之数字在排序数组中出现的次数

剑指Offer-数字在排序数组中出现的次数

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

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

剑指OFFER 数字在排序数组中出现的次数

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