题目:
统计一个数字在排序数组中出现的次数。
解法一:其实很简单,两行代码就搞定,就是用C++ stl里面的lower_bound和upper_bound,lower_bound是找出不小于即大于等于的第一个数的下标 upper_bound是找出大于的第一个数的下标
代码:
class Solution
{
public:
int GetNumberOfK(vector<int> data ,int k)
{
int s1 = lower_bound(data.begin(),data.end(),k)-data.begin();
int s2 = upper_bound(data.begin(),data.end(),k)-data.begin();
//cout<<s1<<" "<<s2<<endl;
return s2-s1;
}
};
解法二: 想刨根问底的话,就要知道lower_bound和upper_bound是怎么实现的,参考STL源码剖析,我们可以写出简化版本
class Solution
{
public:
int my_lower_bound(vector<int> data, int key)
{
int half;
int len = data.size();
int mid;
int first = 0;
while (len > 0)
{
half = len >> 1;
mid = first + half;
//in the right part
if (data[mid] < key)
{
first = mid + 1;
//因为first=mid+1,所以这里的len需要在减去half的基础之上再减去1
len = len - half - 1;
} else
{
//in the left part
len = half;
}
}
return first;
}
int my_upper_bound(vector<int> data, int key)
{
int mid;
int first = 0;
int len = data.size();
int half;
while (len > 0)
{
half = len >> 1;
mid = half + first;
if (data[mid] > key)
{//in the left part
len = half;
} else
{//if arr[mid]<= key ,in the right part
first = mid + 1;
len = len - half - 1;
}
}
return first;
}
int GetNumberOfK(vector<int> data ,int k)
{
int s1 = my_lower_bound(data,k);
int s2 = my_upper_bound(data,k);
cout<<s1<<" "<<s2<<endl;
return s2-s1;
}
};