显然不能直接用原来的二分查找
他想要我们返回一个区间,那么我们应该找到左端点,也要找到右端点,返回这两个段点
找左端点
要先理清怎么找到左段点里面有很多的细节问题需要自己去理解
首先明白left,和right更新的逻辑,
我们现在要先确定左端点,不能在循环里面直接判断numsmid==targrt,这样我们并不能确定mid位置就是边界值的情况,
所以我们将情况分为<,和>=
numsmid<target ,mid左侧包含mid的值都是小于taget,此时更新逻辑是left=mid+1;
numsmid>=target ,mid右侧的值都是大于target,但是mid值不知道是不是就是边界情况,此时更新逻辑是right=mid
循环条件
在前面一个二分查找其实怎么样都行,但是这里就不ok了
循环条件分为一下两种
left<right,因为我们将left和right的更新逻辑已经确定了,并且中途没用判断numsmid==target情况,应该要采用这种
left<=right,如果采用这种会陷入死循环
mid更新逻辑
mid更新主要是关于对于偶数个数据的数组而言,
mid=left+(right-left+1)/2;这取得是中间靠后的位置
mid=left+(right-left)/2;这取得是中间靠前的位置
直接来试一下就ok


找右端点
找右段点的逻辑和左端点相似只是细节有一点不一样,这里不作过多赘述

cpp
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int n=nums.size();
if(n==0)
return {-1,-1};
int left=0,right=n-1;
int begin=0;
int end=0;
//找到左端点
while(left<right)
{
int mid=left+(right-left)/2;
if(nums[mid]>=target)
right=mid;
else
left=mid+1;
}
if(nums[left]==target)
begin=left;
else return{-1,-1};
left=0,right=n-1;
//找到右端点
while(left<right)
{
int mid=left+(right-left+1)/2;
if(nums[mid]<=target)
left=mid;
else
right=mid-1;
}
end=left;
return {begin,end};
}
};