//每次二分查找都是在当前有效数组下进行的,即下标beg到下标end之间
int BinarySearch(int* data, int dataLen, int k, int beg, int end, int mid) {
if (beg > end) {
//没找到,直接返回0
return 0;
}
if (data[mid] == k) {
//找到了一个待查找的值k,并继续分别在左半边数组和右半边数组查找,直到下标beg大于end
return 1 + BinarySearch(data, dataLen, k, mid + 1, end, mid + 1 + (end - (mid + 1)) / 2) + BinarySearch(data, dataLen, k, beg, mid - 1, beg + (mid - 1 - beg) / 2);
}
else if (data[mid] > k) {
//待查找的值k在当前数组的左半边
return 0 + BinarySearch(data, dataLen, k, beg, mid - 1, beg + (mid - 1 - beg) / 2);
}
else {
//待查找的值在当前数组的右半边
return 0 + BinarySearch(data, dataLen, k, mid + 1, end, mid+1 + (end - (mid + 1)) / 2);
}
}
int GetNumberOfK(int* data, int dataLen, int k) {
// write code here
int beg = 0;
int end = dataLen - 1;
int mid = beg + (end - beg) / 2;
int cnt = BinarySearch(data, dataLen, k, beg, end, mid);
return cnt;
}