day1
思路:先找左边界,后找右边界。找两次。
找左边界的时候,需要靠该搜索区间的最右端来确定。找的是最左边的,所以移动right,让左边界 = right
找右边界的时候,需要靠该搜索区间的最左端来确定。找的是最右边的,所以移动left,让右边界 = left
首先目标值的范围是通过l,r的移动夹出来的 要寻找右边界 只能将这个范围不断地往右缩 所以就是操作的left
这里查找的区间不包括 target
注意点:在定义LeftBoard 和RightBoard的时候,不能讲它们定义为 -1 。因为当数组中只有一个元素时,LeftBoard会等于 -1 ,但由于数组中存在该元素,所以这里会出现矛盾,定义为-2,就不会出现这样的问题。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int LeftBorad = searchL(nums,target);
int RightBoard = searchR(nums,target);
if(LeftBorad == -3 || RightBoard == -3) return {-1, -1};
if(RightBoard - LeftBorad > 1) return{LeftBorad + 1, RightBoard - 1};
return {-1, -1};
}
private:
int searchL(vector<int>& nums, int target)
{
int LeftBorad = -3; //为什么不能定义为-1 ?
int left = 0, right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
LeftBorad = right;
}
}
return LeftBorad;
}
int searchR(vector<int>& nums,int target)
{
int RightBoard = -3;
int left = 0, right = nums.size() - 1;
while(left <= right)
{
int mid = left + (right - left)/2;
if(nums[mid] > target)
{
right = mid - 1;
}
else
{
left = mid + 1;
RightBoard = left;
}
}
return RightBoard;
}
};