数字在排序数组中出现的次数
统计一个数字在排序数组中出现的次数,例如输入排序数组{0, 1, 2, 3, 4, 4, 4, 4, 5}和数字4,由于4在这个数组中出现了4次,因此输出4。(出自:剑指offer)
既然输入的数组是排序的,那么很自然地就能想到用二分查找算法。
#include <iostream>
int getFirstK( int *data, int length, int k, int start, int end )
{
if ( start > end )
{
return -1;
}
int midIndex = ( end + start ) / 2;
int midValue = data[ midIndex ];
if ( midValue == k )
{
if ( ( midIndex > 0 && data[ midIndex - 1 ] != k ) || midIndex == 0 )
{
return midIndex;
}
else
{
end = midIndex - 1;
}
}
else if ( midValue > k )
{
end = midIndex - 1;
}
else
{
start = midIndex + 1;
}
return getFirstK( data, length, k, start, end );
}
int getLastK( int *data, int length, int k, int start, int end )
{
if ( start > end )
{
return -1;
}
int midIndex = ( end + start ) / 2;
int midValue = data[ midIndex ];
if ( midValue == k )
{
if ( ( midIndex > 0 && data[ midIndex + 1 ] != k ) || midIndex == length - 1 )
{
return midIndex;
}
else
{
start = midIndex + 1;
}
}
else if ( midValue > k )
{
end = midIndex - 1;
}
else
{
start = midIndex + 1;
}
return getLastK( data, length, k, start, end );
}
int getNumbersOfK( int *data, int length, int k )
{
int num = 0;
if ( data != NULL || length > 0 )
{
int first = getFirstK( data, length, k, 0, length - 1 );
int last = getLastK( data, length, k, 0, length - 1 );
if ( first > -1 && last > -1 )
{
num = last - first + 1;
}
}
return num;
}
int main()
{
int data[] = {0, 1, 2, 3, 4, 4, 4, 4, 5};
int ret4 = getNumbersOfK( data, 9, 4);
std::cout << "4 appear " << ret4 << " times in data." << std::endl;
int ret6 = getNumbersOfK( data, 9, 6 );
std::cout << "6 appear " << ret6 << " times in data." << std::endl;
return 0;
}