1.问题描述
统计一个数字在排序数组中出现的次数。例如输入排序数组{1,2,3,3,3,3,4,5}和数字3 由于3在这个数组中出现了4次,因此输出4.(来自《剑指offer》)
2.分析
因为数组是排序的,我们可以通过这个性质分别找到第一个k和最后一个k,然后计算出k的个数。找k的时候,以前二分查找的时候 找到了k ,我们还要判断是不是第一个k或最后一个k,如果不是的话还要继续查找。直至找到第一个k和最后一个k。
3.代码
int GetFirstK(int *array,int start,int end,int k ,int length)
{
if (array == NULL || start > end )
{
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = array[middleIndex];
if (middleData == k)
{
if ((middleIndex > 0 && array[middleIndex - 1] != k) || middleIndex == 0)
{
return middleIndex;
}
else
{
end = middleIndex -1;
}
}
else if(middleData > k)
{
end = middleIndex -1;
}
else
{
start = middleIndex + 1;
}
return GetFirstK(array, start, end, k,length);
}
int GetLastK(int* array,int start,int end,int k,int length)
{
if (array == NULL || start > end)
{
return -1;
}
int middleIndex = (start + end) / 2;
int middleData = array[middleIndex];
if (middleData == k)
{
if ((middleData == k && array[middleIndex + 1] != k) || middleIndex == length - 1)
{
return middleIndex;
}
else
{
start = middleIndex + 1;
}
}
else if(middleData > k)
{
end = middleIndex - 1;
}
else
{
start = middleIndex + 1;
}
return GetLastK(array, start, end, k,length);
}
int GetNumberOfKey(int* array,int length,int k)
{
if (array == NULL || length <= 0)
{
return 0;
}
int start = GetFirstK(array, 0, length - 1, k , length);
int end = GetLastK(array, 0, length - 1, k, length);
int numberOfKey = end - start + 1;
if (start > -1 && end > -1)
{
numberOfKey = end - start + 1;
}
return numberOfKey;
}