题目:
代码(首刷看解析 2024年3月8日):
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int left = 0, right = nums.size() - 1;
int mid;
while (left <= right) {
mid = left + (right - left) / 2;
if (target < nums[mid]) {
right = mid - 1;
} else if (target > nums[mid]) {
left = mid + 1;
} else {
int rl = mid, rr = mid;
while (rl - 1 >= 0 && nums[rl - 1] == target) {
rl--;
}
while (rr + 1 < nums.size() && nums[rr + 1] == target) {
rr++;
}
return {rl, rr};
}
}
return {-1, -1};
}
};
代码(二刷自解 2024年4月18日)
class Solution {
public:
/*
approach:
二分查找 + 遍历
*/
vector<int> searchRange(vector<int>& nums, int target) {
// 双指针逼近
int left = 0, right = nums.size() - 1;
int mid;
// TODO:while condition
while (left <= right) {
// mid
mid = left + (right - left) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
// INFO: 边界情况
int begin = mid, end = mid;
while (begin >= 0 && nums[begin] == target) {
begin--;
}
while (end < nums.size() && nums[end] == target) {
end++;
}
return {begin + 1, end - 1};
}
}
return {-1,-1};
}
};