数字在排序数组中出现的次数。
统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。
思路:先用二分法拿到第一个要求数字的位置。
int GetFirstK(int* data,int length,int k,int start,int end)
{
if(start>end)
return -1;
int middleIndex=(start+end)/2;
int middleData=data[middleIndex];
if(middleData==k)
{
if((middleIndex)>0&&data[middleIndex-1]!=k||middleIndex==0)
return middleIndex;
else
end=middleIndex-1;
}
else if(middleData>k)
end=middleIndex-1;
else
start=middleIndex+1;
return GetFirstK(data,length,k,start,end);
}
再用二分法求最后一个要求数字
int GetLastK(int* data,int length,int k,int start,int end)
{
if(start>end)
return -1;
int middleIndex=(start+end)/2;
int middleData=data[middleIndex];
if(middleData==k)
{
if((middleIndex<length-1&&datga[middleIndex+1]!=k)
||middleIndex==length-1)
return middleIndex;
else
start=middleIndex+1;
}
else if(middleData<k)
start=middleIndex+1;
else
end=middleIndex-1;
return GetLastK(data,length,k,start,end);
}
接下来整合:
int GetNumberOfK(int* data,int length,int k )
{
int number=0;
if(data!=nullptr&&length>0)
{
int first=GetFirstK( data,length,k,0,length-1);
int last=GetLastK(data,lenmgth,k,0,length-1);
if(first>-1&&last>-1)
number=last-first+1;
}
return number;
}
总结:两个找头找尾的方法都耗时O(logn),所以,总的耗时还是O(logn)。