思路:
分为两步, 先判断左范围, 再判断有范围. 其他步骤和二分法查找一模一样, 要拆成两步其实就是因为二分法查找只需要找到元素, 找到元素后就可以直接返回了, 而现在这个问题要继续查找下去, 所以要分为两路, 左边和右边都要考虑, 所以其实个人感觉递归更适合这道题.
vector<int> searchRange(vector<int>& nums, int target) {
vector<int> res(2, -1);
int left = 0, right = nums.size() - 1;
// 先判断左范围
while (left <= right) {
int mid = (left + right) >> 1;
if (target == nums[mid]) {
res[0] = res[0] == -1 ? mid : min(res[0], mid);
right = mid - 1;
}
else if (target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
if (res[0] == -1) return res;
right = nums.size() - 1;
// 判断右范围
while (left <= right) {
int mid = (left + right) >> 1;
if (target == nums[mid]) {
res[1] = res[1] == -1 ? mid : max(res[1], mid);
left = mid + 1;
}
else if (target < nums[mid])
right = mid - 1;
else
left = mid + 1;
}
return res;
}