题目描述
统计一个数字在排序数组中出现的次数。
思路
查找有序数组,首先考虑使用二分查找,使时间复杂度为O(log n)。更改二分查找的条件,不断缩小区间,直到区间头和区间尾均为k时停止,计算得到区间长度。
代码
class Solution {
public: // 二分查找 O(log n)
int GetNumberOfK(vector<int> data ,int k) {
if (data.size() <=0)
return 0;
int count = 0;
int begin = 0;
int end = data.size()- 1;
while (begin<=end){
int mid = (begin + end) /2;
if (data[begin]==k && data[end] == k)
break;
// 缩小start和end的范围,使start指向第一个k,end指向最后一个k
if (data[begin] < k)
++begin;
if (data[end] > k)
--end;
if (data[mid]< k){
end = mid -1;
} else if (data[mid] > k){
begin = mid +1;
}
}
if (data[begin] ==k && data[end]==k)
return end - begin +1 ; // beg和end分别对应第一个和最后一个k所在位置
else
return 0; // beg>end 不存在该元素
}
};