题目中要求时间复杂度O(logn),所以直接用二分查找。
总体思路是通过二分查找找到要找的数,然后在查找该数周围相同的数,最后返回累计计数。复杂度满足题目要求。
因为写完一次过了,所以代码结构还有较大调整空间。
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int count = 0;
int index;
int left = 0;
int right = data.size() - 1;
while(right >= left){
int mid = left + (right - left)/2;
if(data.at(mid) == k){
index = mid;
break;
}
else if(data.at(mid) > k){
right = mid - 1;
}
else{
left = mid + 1;
}
}
if(right < left){
return 0;
}
for(int i = index;i < data.size();i++){
if(data.at(i) == k){
count++;
}
else{
break;
}
}
if(index > 0){
for(int i = index - 1;i >= 0;i--){
if(data.at(i) == k){
count++;
}
else{
break;
}
}
}
return count;
}
};