题目:统计一个数字在排序数组中出现的次数。例如,输入排序数组{1,2,3,3,3,3,4,5}和数字3由于3在这个数组中出现了4次,因此输出4。
题目解法很多,关键是要找到让人满意的方法,直接统计当然可以,可是显然不是我们要的答案。
比较好的思路如下:
使用二分查找的拓展,当查找的元素有重复的时,找到元素的第一个和最后一个。这样将可以计算出该元素有多少个重复的了。二分法在数组中查找一个合乎要求的数字时间复杂度是O(logn),因此总的时间复杂度也只有O(logn)。
//递归找到排序数组中第一个k
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)
{
//判断是否是第一个k
if ((middleIndex>0&&data[middleIndex-1]!=k)||middleIndex==0)
{
return middleIndex;
}
else
{//第一个k肯定在左边
end=middleIndex-1;
}
}
else if (middleData>k)
{
end=middleIndex-1;
}
else
start=middleIndex+1;
//递归
return GetFirstK(data,length,k,start,end);
}
//同样的思路,递归找到最后的一个k
int GetEndK(int *data, int length, i