#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int searchBegin(vector<int> testVec, int target)
{
int left = 0;
int right = testVec.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (testVec[mid] == target)
{
//找到了target,但是要找的是连续的target的第一个,所以通过前一个元素判断
//(注意这个元素本就是第一个元素的情况的特殊处理)这个位置是不是第一个target,
if (mid == 0 || testVec[mid - 1] < target)
{
//如果前一个元素小于了target,那么你找的mid位置的元素就是第一个target的位置
return mid;
}
//如果不是第一个,要在mid的前面区间继续寻找第一个target的位置
right = mid - 1;
}
else if (testVec[mid] > target)
{
//mid位置的值大于target,那么要在mid的左边继续寻找
right = mid - 1;
}
else
{
//mid位置的值小于target,那么要在mid的右边继续寻找
left = mid + 1;
}
}
//二分结束没有找到target,返回-1;
return -1;
}
int searchEnd(vector<int> testVec, int target)
{
int left = 0;
int right = testVec.size() - 1;
while (left <= right)
{
int mid = left + (right - left) / 2;
if (testVec[mid] == target)
{
//找到了target,但是要找的是连续的target的最后一个,所以通过后一个元素判断
//(注意这个元素本就是最后一个元素的情况的特殊处理)这个位置是不是第一个target,
if (mid == testVec.size() - 1 || testVec[mid + 1] > target)
{
//如果前一个元素小于了target,那么你找的mid位置的元素就是第一个target的位置
return mid;
}
//如果不是第一个,要在mid的前面区间继续寻找第一个target的位置
left = mid + 1;
}
else if (testVec[mid] > target)
{
//mid位置的值大于target,那么要在mid的左边继续寻找
right = mid - 1;
}
else
{
//mid位置的值小于target,那么要在mid的右边继续寻找
left = mid + 1;
}
}
//二分结束没有找到target,返回-1;
return -1;
}
int search(vector<int> testVec, int target)
{
int beginPos = searchBegin(testVec, target);
int endPos = searchEnd(testVec, target);
if (beginPos == -1 && endPos == -1) return 0;
return endPos - beginPos + 1;
}
int main()
{
vector<int> testVec = { 5, 7, 7, 8, 8, 10};
int target = 5;
int result = search(testVec, target);
cout << target<< "个数是:" << result << endl;
target = 7;
result = search(testVec, target);
cout << target << "个数是:" << result << endl;
target = 8;
result = search(testVec, target);
cout << target << "个数是:" << result << endl;
target = 10;
result = search(testVec, target);
cout << target << "个数是:" << result << endl;
target = 11;
result = search(testVec, target);
cout << target << "个数是:" << result << endl;
}