//find the num of the array times ;
//BinarySearch
int GetFirstK(int data[], int len, int k, int start, int end)
{
if (start>end)
return -1;
int midindex = (start + end) / 2;
int middata = data[midindex];
if (middata == k)
{
if (midindex > 0 && data[midindex - 1] != k || midindex == 0)
return midindex;
else
end = midindex - 1;
}
else if (middata > k)
{
end = midindex - 1;
}
else
{
start = midindex + 1;
}
return GetFirstK(data, len, k, start, end);
}
int GetLastK(int data[], int len, int k, int start, int end)
{
if (start>end)
return -1;
int midindex = (start + end) / 2;
int middata = data[midindex];
if (middata == k)
{
if (midindex<len-1 && data[midindex +1] != k || midindex == len-1)
return midindex;
else
end = midindex + 1;
}
else if (middata < k)
{
start = midindex + 1;
}
else
{
end = midindex - 1;
}
return GetLastK(data, len, k, start, end);
}
int GetNumOfK(int data[], int len, int k)
{
int num = 0;
if (data != NULL && len > 0)
{
int first = GetFirstK(data, len, k, 0, len - 1);
int end = GetLastK(data, len, k, 0, len - 1);
if (first > -1 && end > -1)
{
num = end - first + 1;
}
}
return num;
}二分查找解决数组中出现数字的次数
最新推荐文章于 2021-03-28 16:15:42 发布
本文介绍了一种使用二分查找算法确定有序数组中特定元素首次和最后一次出现位置的方法,进而计算该元素在数组中出现的总次数。通过递归实现的两个辅助函数GetFirstK和GetLastK,分别找到目标元素的起始和结束位置,最终返回两者之差加一作为元素出现的次数。
1049

被折叠的 条评论
为什么被折叠?



