#include<iostream>
#include<vector>
using namespace std;
//二分边界问题的探讨
//1.确定左右边界
//两种方法 [0,n) 或者[0,n-1]
//即初始化 l=0 r=n 或者l=0 r=n-1
//习惯用于第一种
//2.确定终止条件
//这里用是否能遍历数组所有元素来进行记忆
//如果是[0,n) while(l<r)即可
//可以带入特值法验证 当n=1时 即只有一个元素 [0,1) l若用l<=r 当l=r=1时 会取到1 而实际不存在1处位置 会报错
//所以要用l<r此时当l=r=1时会跳出
//若是[0,n-1] 当只有1个元素 [0,0]若用l<r 则l=r=0这个元素取不到 只能用l<r
//3.获得中点 注意取中点时不要溢出长度
//4.收缩区间
//必须保证每次进入while之后 区间要缩小不能无限循环
//当为[0,n)
//1)left=mid 当mid对应不可能是解时 必须舍弃mid 因为left可以被取到 当left=mid的时候 就无限循环了
//2)left=mid+1 所以必须选2)
//a)right=mid 当mid不可能为解时 舍弃mid 因为由2 终止条件知 right取不到 所以right可以等于mid
//b)right=mid-1 如果right=mid-1 又因为right取不到 所以mid-1取不到
class Solution {
public:
int search(vector<int>& nums, int target) {
int l=0;
int r=nums.size();
int k=l+r>>1;
while(l<r)
{
k=l+(r-l)/2;
if(nums[k]>target)
{
r=k;
}
else if(nums[k]==target)
break;
else if(nums[k]<target)
{
l=k+1;
}
}
int m=k;
int count1=0;
while(1)
{
if(nums[m]==target)
{
count1++;
m--;
}
else break;
}
m=k+1;
while(1)
{
if(nums[m]==target)
{
count1++;
m++;
}
else break;
}
return count1;
}
};
int main()
{
}