class Solution {
public:
int searchleft(vector<int>& nums,int target)
{
int l = 0,r = nums.size() - 1;
int res = -1;
while(l <= r)
{
int mid = l + r >> 1;
if(nums[mid] > target) r = mid - 1;
else if(nums[mid] < target) l = mid + 1;
else{
res = mid;
r = mid - 1; //找出现的第一个即左边界就要到左半边找
}
}
return res;
}
int searchright(vector<int>& nums,int target)
{
int l = 0,r = nums.size() - 1;
int res = -1;
while(l <= r)
{
int mid = l + r >> 1;
if(nums[mid] > target) r = mid - 1;
else if(nums[mid] < target) l = mid + 1;
else{
res = mid;
l = mid + 1;
}
}
return res;
}
vector<int> searchRange(vector<int>& nums, int target) {
int left = searchleft(nums,target);
int right = searchright(nums,target);
return {left,right};
}
};
主要考察当二分查找时出现重复元素的情况,需要用左边界函数和右边界函数分别寻找。