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

题目描述:

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


分析:

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


代码:

 1 class Solution {
 2 public:
 3     int GetNumberOfK(vector<int> data, int k) {
 4         int dataSize = data.size();
 5         if(dataSize == 0) return 0;
 6         int firstK = GetPositionOfFirstK(data, k, 0, dataSize - 1);
 7         if(firstK == -1) return 0;  // k不存在
 8         int lastK = GetPositionOfLastK(data, k, 0, dataSize - 1);
 9         return lastK - firstK + 1;
10     }
11     int GetPositionOfFirstK(vector<int> data, int k, int left, int right) { // 二分找最左的k的位置
12         int mid = (left + right) >> 1;
13         while(left < right) {
14             if(data[mid] > k) {
15                 right = mid - 1;
16             } else if(data[mid] < k) {
17                 left = mid + 1;
18             } else {
19                 if(data[left] != k) left++;
20                 else return left;
21                 right = mid;
22             }
23             mid = (left + right) >> 1;
24         }
25         return data[mid] == k ? mid : -1;
26     }
27     int GetPositionOfLastK(vector<int> data, int k, int left, int right) {  // 二分找最右的k的位置
28         int mid = (left + right) >> 1;
29         while(left < right) {
30             if(data[mid] < k) {
31                 left = mid + 1;
32             } else if(data[mid] > k) {
33                 right = mid - 1;
34             } else {
35                 if(data[right] != k) right--;
36                 else return right;
37                 left = mid;
38             }
39             mid = (left + right) >> 1;
40         }
41         return data[mid] == k ? mid : -1;
42     }
43 };