这道题是一道二分法的变形题,非常重要,感觉有难度。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
if (nums.empty()) return{ -1,-1 };
int l = 0, r = nums.size() - 1;
while (l < r)
{
int mid = (l + r) / 2;
//第一次二分是为了找到最左侧的target下标
if (nums[mid] < target)
{
l = mid + 1;
}
else
r = mid;
}
if (nums[l] != target) return{ -1,-1 };
int ll = 0, rr = nums.size();//注意初始值有讲究
while (ll < rr)
{
int mid = (ll + rr) / 2;
//第二次二分是为了找到最右侧的target下标(寻找右边界时,找到第一个大于它的数,然后减一就好了)
//这里rr = nums.size()可以通过特例(数组元素全为target)来理解
if (nums[mid] <= target)
ll = mid + 1;
else
rr = mid;
}
return{ r,ll - 1 };
}
};