显然数组中数字可以出现多次。
排序数组,要求时间高效,肯定要用二分查找 ,只是这里要查找的元素可能出现多次。所以需要对经典的二分查找稍作改变。
非递归算法如下:
#include
using namespace std;
/* 函数返回找到的数组下标,没找到返回-1。
wantLeft为true:查找最左的val; 否则查找最右的 */
int repeatedTimesOfNumber( int *arr, int left, int right, int val, bool wantLeft ) {
if( arr == NULL )
return -1;
int last=-1; /* 保存上次找到的数组下标 */
int mid = ( left + right ) / 2;
while( left <= right ) {
if( val > arr[mid] )
left = mid + 1;
else if( val < arr[mid] )
right = mid - 1;
else {
last = mid;
if( wantLeft ) {
right = mid - 1;
} else {
left = mid + 1;
}
}
mid = ( left + right ) / 2;
} // while
return last;
}
int main()
{
int arr[] = {1,2,3,3,3,3,4,5};
int lowerPos = repeatedTimesOfNumber( arr, 0, sizeof(arr)/sizeof(arr[0]) - 1, 3, true );
int upperPos = repeatedTimesOfNumber( arr, 0, sizeof(arr)/sizeof(arr[0]) - 1, 3, false );
cout << "lower position: " << lowerPos << endl;
cout << "upper position: " << upperPos << endl;
cout << upperPos - lowerPos + 1 << endl;
return 0;
}