牛客网:统计一个数字在排序数组中出现的次数
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int cishu = 0;
for(auto r : data)
{
if (r==k)
{
cishu++;
}
}
return cishu;
}
};
最简单的方法
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
int cishu = 0;
auto a = equal_range(data.begin(),data.end(),k);
cishu = a.second - a.first;
return cishu;
}
};
利用STL中的二分查找函数equal_range
class Solution {
public:
int GetNumberOfK(vector<int> data ,int k) {
if(!data.size()){
return 0;
}
auto b = data.begin(),e = data.end()-1;
auto m = b+(e-b)/2;
while(e>=b)
{
if(*m==k)
{
break;
}
if(*m<k)
{
b = m + 1;
}
if(*m>k)
{
e = m - 1;
}
m = b+(e-b)/2;
}
int count = 0;
for(auto r = m;r<=e;r++)
{
if (*r==k)
{
count++;
}
else
{
break;
}
}
for(auto r = m-1;r>=b;r--)
{
if (*r==k)
{
count++;
}
else
{
break;
}
}
return count;
}
};
二分查找,上午段错误不通过的原因是由于缺少data为空的判断
class Solution {
public:
int search(vector<int>& nums, int target) {
if (!nums.size())
{
return -1;
}
auto b = nums.begin(),e = nums.end();
auto m = b+(e-b)/2;
while(e>b)
{
if(*m>target){
e = m;
}
if(*m<target){
b = m+1;
}
if(*m==target){
return (m - nums.begin());
}
m = b+(e-b)/2;
}
return -1;
}
};
经典二分法