统计一个数字在排序数组中出现的次数。
因为data中都是整数,所以可以稍微变一下,不是搜索k的两个位置,而是搜索k-0.5和k+0.5
找到的index是k-0.5和k+0.5所在的下一个index,然后相减即可。
注意right要-1,left要+1
class Solution {
private:
int GetNumberOfKCore(vector<int> &data ,double k){
int left = 0, right = data.size() - 1;
while(left <= right){
int mid = (left + right) / 2;
if(data[mid] > k)
right = mid - 1;
else if(data[mid] < k)
left = mid + 1;
}
return left;
}
public:
int GetNumberOfK(vector<int> data ,int k) {
int left = GetNumberOfKCore(data, (double)k - 0.5);
int right = GetNumberOfKCore(data, (double)k + 0.5);
return right - left;
}
};
注意退出条件是,本位置数字与下标不相等且前一个位置数字与下标相等
vector<int> a = {0,1,3,4,5,6,7,8,9};
int GetNumberOfK(vector<int> data) {
int left = 0, right = data.size() - 1;
while(left <= right){
int mid = (left + right) / 2;
if(data[mid] != mid && data[mid - 1] == mid - 1)
return mid;
else if(data[mid] == mid)
left = mid + 1;
else
right = mid - 1;
}
}