/*
38 :>数字在排序数组中出现的次数
{1,2,3,3,3,3,4,5} 3出现4次
遍历一遍O(n)
更优解:
归并查找第一个3,位置first;最后一个3,位置last
个数 last-first+1
*/
int GetNumFirstPos(int* ar,int len,int start,int end,int k);
int GetNumlastPos(int* ar, int len, int start, int end, int k);
int GetNumTimes(int* ar, int len, int k)
{
if (ar == NULL || k <= 0)
return 0;
int times = 0;
int first = GetNumFirstPos(ar,len,0,len-1,k);
int last = GetNumlastPos(ar, len, 0, len - 1, k);
if (first > -1 && last > -1)
times = last - first + 1;
return times;
}
int GetNumFirstPos(int* ar, int len, int start, int end, int k)
{
if (start > end)
return -1;
int midPos = (end + start) / 2;
int midData = ar[midPos];
if (midData == k)
{
if ( (midPos>0 && ar[midPos-1]!=k) || midPos == 0)
return midPos;
else
end = midPos - 1;
}
else if (midData > k)
end = midPos - 1;
else
start = midPos + 1;
return GetNumFirstPos(ar, len, start, end, k);
}
int GetNumlastPos(int* ar, int len, int start, int end, int k)
{
if (start > end)
return -1;
int midPos = (end + start) / 2;
int midData = ar[midPos];
if (midData == k)
{
if ((midPos < len-1 && ar[midPos + 1] != k) || midPos == len-1)
return midPos;
else
start = midPos + 1;
}
else if (midData < k)
start = midPos + 1;
else
end = midPos - 1;
return GetNumlastPos(ar, len, start, end , k);
}