题目:
统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4次,因此输出4。
关键词:
二分查找
class Solution
{
public:
int GetNumberOfK( vector<int> data, int k )
{
int number = 0;
if ( data.empty() )
return 0;
int first = GetFirstK( data, k, 0, data.size()-1 );
int last = GetLastK( data, k, 0, data.size()-1 );
if ( first > -1 && last > -1 )
number = last - first + 1;
return number;
}
int GetFirstK( vector<int> data, int k, int start, int end )
{
if ( start > end )
return -1;
int mid = ( start + end ) / 2;
if ( data[mid] == k )
{
if ( (mid > 0 && data[mid-1] != k) || mid == 0 )
return mid;
else
end = mid-1;
}
else if ( data[mid] < k )
{
start = mid+1;
}
else
end = mid-1;
return GetFirstK( data, k, start, end );
}
int GetLastK( vector<int> data, int k, int start, int end )
{
if ( start > end )
return -1;
int mid = ( start + end ) / 2;
if ( data[mid] == k )
{
if ( (mid < data.size()-1 && data[mid+1] != k) || mid == data.size()-1 )
return mid;
else
start = mid+1;
}
else if ( data[mid] < k )
{
start = mid+1;
}
else
{
end = mid-1;
}
return GetLastK( data, k, start, end );
}
};
int main( void )
{
Solution sos;
vector<int> data = { 1, 2, 3, 3, 3, 3, 4, 5 };
cout << sos.GetNumberOfK( data, 3 ) << endl;
return 0;
}