这个题目要求比遍历更低的时间复杂度,那么需要2个二分查找,第一个二分查找为查找数组中第一个为K的位置,第二个二分查找为查找数组中最后一个为K的位置。2个位置之差即为次数
比较巧妙的解法:
class Solution {
public:
int bisearch(vector<int>& data, float k){ //二分查找
int left = 0;
int right = data.size() - 1;
while(left <= right){ //二分左右界
int mid = (left + right) / 2;
if(data[mid] < k)
left = mid + 1;
else if(data[mid] > k)
right = mid - 1;
}
return left;
}
int GetNumberOfK(vector<int> data ,int k) {
//分别查找k+0.5和k-0.5应该出现的位置,中间的部分就全是k
return bisearch(data, k + 0.5) - bisearch(data, k - 0.5);
}
};