题目描述
统计一个数字在排序数组中出现的次数。
- 算法:二分查找法
- 数据结构:数组
- 编程语言:C++
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(data.empty())
return 0;
//获取数组的长度
int length=data.size();
int left=getFirstK(data,length,k,0,length-1);
int right=getLastK(data,length,k,0,length-1);
if(left!=-1&&right!=-1)
return right-left+1;
return 0;
}
int getFirstK(vector<int> &data,int length,int k,int start,int end)
{
//没找到K 返回-1
if(start>end)
return -1;
//中间值
int mid=(start+end)/2;
int midData=data[mid];
if(midData==k)
{
//左边的不是K,向左递归
if((mid>0&&data[mid-1]!=k)||mid==0)
return mid;
else
//如果不是最左边的k,向左递归
end=mid-1;
}
else if(midData>k)
{
end=mid-1;
}
else
{
start=mid+1;
}
return getFirstK(data,length,k,start,end);
}
int getLastK(vector<int> &data,int length,int k,int start,int end)
{
if(start>end)
return -1;
int mid=(start+end)/2;
int midData=data[mid];
if(midData==k)
{
if((mid<length-1&&data[mid+1]!=k)||mid==length-1)
{
return mid;
}
else
{
start=mid+1;
}
}
else if(midData>k)
{
end=mid-1;
}
else
{
start=mid+1;
}
//递归
return getLastK(data,length,k,start,end);
}
};