這是二分搜索的一個應用,找到FirstK以及LastK
代碼比較簡單
int NumofK(int *pData,int nLen,int k)
{
int nIndexLeft=GetFirstK(pData,nLen,k);
if (nIndexLeft!=-1)
{
return GetLastK(pData,nLen,k)-nIndexLeft+1;
}
return 0;
}
int GetFirstK(int *pData,int nLen,int k)
{
if (pData==NULL||nLen==0)
{
return -1;
}
unsigned int first=0;
unsigned int last=nLen-1;
while(first<last)
{
unsigned int mid=(first+last)/2;
if (pData[mid]==k)
{
if ((pData[mid-1]!=k&&mid>0)||mid==0)
{
return mid;
}
last=mid;
continue;
}
if (pData[mid]>k)
{
last=mid;
}
else
{
first=mid+1;
}
}
if (pData[first]==k)
{
return first;
}
return -1;
}
int GetLastK(int *pData,int nLen,int k)
{
if (pData==NULL||nLen==0)
{
return -1;
}
unsigned int first=0;
unsigned int last=nLen-1;
while(first<last)
{
unsigned int mid=(first+last)/2;
if (pData[mid]==k)
{
if ((pData[mid+1]!=k&&mid<(unsigned int)(nLen-1))||mid==nLen-1)
{
return mid;
}
first=mid+1;
continue;
}
if (pData[mid]>k)
{
last=mid;
}
else
{
first=mid+1;
}
}
if (pData[first]==k)
{
return first;
}
return -1;
}