解法一
idea:找出第一个等于k的位置,如果不存在k则返回0。注意临界点(low<=high而不是low<high)。找到k以后在(0~index(而不是0~index-1))找出第一个等于k但是前一个数不等于k的下标,右边同理。 code
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int ans = 0;
int len = data.size();
if (len == 0) return ans;
int low = 0, high = len-1, mid;
int index = 0;
while (low <= high){
mid = (low+high) / 2;
if (data[mid] == k){
index = mid;
break;
}
if (data[mid] < k){
low = mid+1;
}
else if (data[mid] > k){
high = mid-1;
}
}
if (low>high) return 0;
low = 0, high = index;
int low_index = mid, high_index=mid;
while (low <= high){
mid = (low+high) / 2;
if (data[mid] == k){
if (mid == 0 || data[mid-1] != k){
low_index = mid;
break;
}
high = mid-1;
}
if (data[mid]<k){
low = mid+1;
}
else if (data[mid] > k) return 0;
}
low = index, high = len-1;
while (low <= high){
mid = (low+high) / 2;
if (data[mid] == k){
if (mid == len-1 || data[mid+1] != k){
high_index = mid;
break;
}
low = mid+1;
}
if (data[mid]>k){
high = mid-1;
}
else if (data[mid] < k) return 0;
}
return high_index-low_index+1;
}
};
解法二:
idea:使用二分查找,找到应该插入k-0.5以及k+0.5的位置 code
class Solution {
public:
int Bi_Search(vector<int> data, int low, int high, double k){
while (low <= high){
int mid = (low+high)/2;
if (data[mid] < k){
low = mid+1;
}
else{
high = mid-1;
}
}
return low;
}
int GetNumberOfK(vector<int> data ,int k) {
int len = data.size();
if (len == 0) return 0;
return Bi_Search(data, 0, len-1, k+0.5) - Bi_Search(data, 0, len-1, k-0.5);
}
};