思路:
1 因为数组是有序的,因此可以遍历数组,遇到比K大的数就终止,时间复杂度O(n)
int GetNumberOfK(vector<int> data ,int k) {
int count=0;
for(int i=0;i<data.size();i++){
if(data[i]==k){
count++;
}
if(data[i]>k){
break;
}
}
return count;
}
2 利用二分查找,找到后,可以在小范围内再查找
int GetNumberOfK(vector<int> data ,int k) {
int count=0;
int start=0;
int end=data.size()-1;
while(start<=end){
int mid=(start+end)/2;
if(data[mid]==k){
count++;
int low=mid-1;
int high=mid+1;
while(data[low]==k){
count++;
low--;
}
while(data[high]==k){
count++;
high++;
}
break;
}else if(data[mid]>k){
end=mid-1;
}else{
start=mid+1;
}
}
return count;
}
3 还是利用二分查找查找
int GetNumberOfK(vector<int> data ,int k) {
int count=0;
int first=GetFirstIndexOfK(data,k,0,data.size()-1);
int last=GetLastIndexOfK(data,k,0,data.size()-1);
if(first>-1&&last>-1)
count=last-first+1;
return count;
}
//用递归
int GetFirstIndexOfK(vector<int> data,int k,int start,int end){
if(start>end)
return -1;
int mid=(start+end)>>1;
if(data[mid]>k){
end=mid-1;
//turn GetFirstIndexOfK(data,k,start,end);
}else if(data[mid]<k){
start=mid+1;
//turn GetFirstIndexOfK(data,k,start,end);
}else{
if(mid>0&&data[mid-1]!=k || mid==0){
return mid;
}else{
end=mid-1;
//eturn GetFirstIndexOfK(data,k,start,end);
}
}
return GetFirstIndexOfK(data,k,start,end);
}
//用非递归
int GetLastIndexOfK(vector<int> data,int k,int start,int end){
while(start<=end){
int mid=(start+end)>>1;
if(data[mid]>k){
end=mid-1;
}else if(data[mid]<k){
start=mid+1;
}else{
if(mid<end&&data[mid+1]!=k || mid==end){
return mid;
}else{
start=mid+1;
}
}
}
return -1;
}