【正确答案】
【答案解析】如何在排序数组中,找出给定数字出现的次数?例如,数组[1,2,2,2,3]中2的出现次数是3次。
该问题的解决需要在二分查找法的基础上进行改进。设数组array为递增序列,需要查找的元素为findData,为了求解给定数字出现的次数,可以分别寻找findData在array中最先出现的位置和最后出现的位置,通过两者的算术运算即可获得该数字的出现次数。编码的时候,用一个变量last来存储本次查找到的位置,然后根据情况变换查找方向,就可以分别确定最先出现的位置的下标left和最后出现的位置的下标right的值。
具体实现代码如下:
#include<stdio.h>
∥isLeft标记的值是否在左边
int BinarySearch(int*a,int length,int num,bool isLeft)
{
int left=0,right=length-1;
int last=-1;
while(left<=right)
{
int mid=(left+right)/2;
if(a[mid]<num)
{
left=mid+1;
}
else if(a[mid]>num)
{
right=mid-1;
}
else
{
last=mid;
if(isLeft)
{
right=mid-1;
}
else
{
left=mid+1;
}
}
}
return last;
}
int main()
{
int array[]={0,1,2,3,3,3,3,3,3,3,3,4,5,6,7,13,19};
int Lower=BinarySearch(array,sizeof(array)/sizeof(array[0]),3,true);
int Upper=BinarySearch(array,sizeof(array)/sizeof(array[0]),3,false);
int count=Upper-Lower+1;
printf("%d/n",count);
return 0;
}
程序输出结果:
8