题目:
统计一个数字在排序数组中出现的次数。
解法:
1、先求该数字出现的最左边位置。
2、再求该数字出现的最右边位置。
3、若该数字未出现,则会出现left在right右边。且相邻的情况。
最后结果仍然为right-left+1 =0
代码:
int GetNumberOfK(vector<int> data ,int k) {
if(data.size()==0||data.empty() ) //边界异常判断
return 0;
int n = data.size();
int left =0;
int right = n-1;
while(left<=right) //两个while只有一处不一样,
{ // 求left位置
int mid = (right+left)>>1;
if(data[mid]<k)
left = mid+1;
else if(data[mid]>k)
right = mid-1;
else if(data[mid]==k) 中间值等于目标值K,那么出现k值的最左边位置一定位于left,mid-1之间。
right =mid-1;
}
int a= left;
left =0;
right = n-1;
while(left<=right) //求right位置。
{
int mid = (right+left)>>1;
if(data[mid]<k)
left = mid+1;
else if(data[mid]>k)
right = mid-1;
else if(data[mid]==k) //中间值等于目标k,那么出现K的最右位置一定在mid+1,right之间。
left =mid+1;
}
return right-a+1;
}