二分查找
- 起始位置:查找第一个大于等于目标值的位置
- 结束位置:查找第一个大于目标值的元素位置 - 1
- 两个位置合法,且指向的值都为目标值,直接返回
class Solution {
public:
int upper_target(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size()-1;
int res = nums.size();
while(left <= right)
{
int mid = (left + right)>>1;
if(nums[mid] > target)
{
res = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return res;
}
int lower_target(vector<int>& nums, int target)
{
int left = 0;
int right = nums.size()-1;
int res = nums.size();
while(left <= right)
{
int mid = (left + right)>>1;
if(nums[mid] >= target)
{
res = mid;
right = mid - 1;
}
else
{
left = mid + 1;
}
}
return res;
}
vector<int> searchRange(vector<int>& nums, int target) {
int start = lower_target(nums, target);
int end = upper_target(nums, target) - 1;
if(start<=end && start<nums.size() && end<nums.size() && nums[start]==target && nums[end]==target)
return {start, end};
return {-1,-1};
}
};