// 利用二分查找,找到之后再分别利用二分查找,找出第一次出现的位置和最后一次出现的位置
#include<iostream>
#include<algorithm>
#include<time.h>
using namespace std;
int* findFirst(int * arr, int size, int target) {
if (arr == NULL || size <= 0) {
return NULL;
}
int * mid = arr + (size >> 1);
if (*mid > target) {
return findFirst(arr, mid - arr, target);
} else if (*mid < target) {
return findFirst(mid + 1, size - (mid - arr) - 1, target);
} else {
if (mid == arr || mid > arr && *(mid-1) < target) { // 注意边界条件检查 mid == arr (mid为第一个)
return mid;
} else {
return findFirst(arr, mid - arr, target); // 利用二分查找向前找第一个
}
}
}
int * findLast(int * arr, int size, int target) {
if (arr == NULL || size <= 0) {
return NULL;
}
int * mid = arr + (size >> 1);
if (*mid > target) {
return findLast(arr, mid - arr, target);
} else if (*mid < target) {
return findLast(mid + 1, size - (mid - arr) - 1, target);
} else {
if (mid == arr + size - 1 || mid < arr + size && *(mid+1) > target) { // mid == arr + size - 1 (mid为最后一个)
return mid;
} else {
return findLast(mid + 1, size - (mid - arr) - 1, target); // 利用二分查找向后找最后一个
}
}
}
int getCount(int * arr, int size, int target) {
int * first = findFirst(arr, size, target);
int * last = findLast(arr, size, target);
if (first == NULL || last == NULL) { // 注意不存在的情况
return 0;
}
return last - first + 1;
}
void printArr(int * arr, int size) {
for (int i = 0; i < size; ++i) {
cout << *(arr + i) << " ";
}
cout << endl;
}
int main() {
srand((int)time(0));
const int SIZE = 20;
int arr[SIZE];
for (int i = 0; i < SIZE; i++) {
arr[i] = rand() % SIZE;
}
printArr(arr, SIZE);
sort(arr, arr + SIZE);
printArr(arr, SIZE);
int target = 0;
int cnt = SIZE >> 1;
while(cnt--) {
cout << "Input target: ";
cin >> target;
cout << target << "'s count: " << getCount(arr, SIZE, target) << endl;
}
return 0;
}