/*
题目:
统计一个数字在排序数组中出现的次数。
*/
/*
思路:
1、从前往后遍历,时间复杂度O(n)。
2、二分查找到目标数字target,向前向后遍历,时间复杂度O(n)。
3、利用二分法,递归找到数字出现的第一个位置和最后一个位置,时间复杂度O(logn)。
*/
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int getFirstOfK(vector<int> &A,int start,int end, int target){
if(start > end) return -1;
int mid = (start + end) / 2;
if(A[mid] > target){
return getFirstOfK(A,start,mid-1,target);
}else if(A[mid] < target){
return getFirstOfK(A,mid+1,end,target);
}else{
if(mid == 0 || A[mid-1] != target){
return mid;
}else{
return getFirstOfK(A,start,mid-1,target);
}
}
}
int getLastOfK(vector<int> &A,int start,int end,int target){
if(start > end) return -1;
int mid = (start+end) / 2;
if(A[mid] > target){
return getLastOfK(A,start,mid-1,target);
}else if(A[mid] < target){
return getLastOfK(A,mid+1,end,target);
}else{
if(mid == end || A[mid+1] != target){
return mid;
}else{
return getLastOfK(A,mid+1,end,target);
}
}
}
int getNumbersOfK(vector<int> &A, int target){
int first = getFirstOfK(A,0,A.size()-1,target);
int last = getLastOfK(A,0,A.size()-1,target);
if(last != -1 && first != -1){
return last - first + 1;
}
return 0;
}
int main(){
vector<int> a = {1,1,3,4,4,4,5};
cout<<getNumbersOfK(a,1);
}