统计一个数字在排序数组中出现的次数 。【采用二分查找的变体】
class Solution {
public:
// Again!!!!
int getLeftC(vector<int> a,int len, int left, int right, int k)
{
int mid;
while (left <= right)
{
mid = left + (right - left) / 2;
if (a[mid] == k)
{
if (mid == 0 || mid - 1 >= 0 && a[mid - 1] != k)
return mid;
else
{
right = mid - 1;
}
}
else if (a[mid] > k)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
int getRightC(vector<int> a,int len, int left, int right, int k)
{
int mid;
while (left <= right)
{
mid = left + (right - left) / 2;
if (a[mid] == k)
{
if (mid ==len-1 || mid + 1 <=len-1 && a[mid + 1] != k)
return mid;
else
{
left = mid + 1;
}
}
else if (a[mid] > k)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return -1;
}
int GetNumberOfK(vector<int> data ,int k) {
int len=data.size();
if(len<=0)
return 0;
int c1=getLeftC(data,len,0,len-1,k);
int c2=getRightC(data,len,0,len-1,k);
if(c1==-1 || c2==-1)
return 0;
return c2-c1+1;
}
};