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

题目描述
统计一个数字在排序数组中出现的次数。
 
解题思路:本题因为数组是有序的,因此采用二分查找的方式找到k,要知道k出现次数,先找到第一个k出现的位置,再找到最后一个k出现的位置,最后k出现次数为last-first+1
 1 class Solution {
 2 public:
 3     //通过二分法找到数组中第一个k出现位置
 4     int GetFirstK(vector<int> data,int length, int k, int start, int end)
 5     {
 6         if(start > end)
 7             return -1;
 8         int middleIndex = (start+end)/2;
 9         int middleData = data[middleIndex];
10         if(middleData == k)
11         {
12             if((middleIndex > 0 && data[middleIndex-1] != k) || (middleIndex == 0))//middleIndex为第一个k位置
13             {
14                 return middleIndex;
15             }
16             else//在左侧
17             {
18                 end = middleIndex - 1;
19             }
20         }
21         else if(middleData > k)
22         {
23             end = middleIndex - 1;
24         }
25         else
26         {
27             start = middleIndex + 1;
28         }
29         return GetFirstK(data,length,k,start,end);
30     }
31     //通过二分法找到数组中最后一个k出现位置
32     int GetLastK(vector<int> data,int length, int k, int start, int end)
33     {
34         if(start > end)
35             return -1;
36         int middleIndex = (start+end)/2;
37         int middleData = data[middleIndex];
38         if(middleData == k)
39         {
40             if((middleIndex<length-1 && data[middleIndex+1] != k) || (middleIndex == length - 1))//恰为最后一个
41             {
42                 return middleIndex;
43             }
44             else
45             {
46                 start = middleIndex+1;
47             }
48         }
49         else if(middleData > k)//左侧
50         {
51             end = middleIndex - 1;
52         }
53         else
54         {
55             start = middleIndex + 1;
56         }
57         return GetLastK(data,length,k,start,end);
58     }
59     int GetNumberOfK(vector<int> data ,int k)
60     {
61         int num = 0;
62         int length = data.size();
63         if(!data.empty() && length >0)
64         {
65             int first = GetFirstK(data,length,k,0,length-1);
66             int last = GetLastK(data,length,k,0,length-1);
67             if(first > -1 && last > -1)
68             {
69                 num = last - first + 1;
70             }
71         }
72         return num;
73     }
74 };
原文地址:https://www.cnblogs.com/qqky/p/7010292.html