class Solution {
public int[] searchRange(int[] nums, int target) {
int l = 0, r = nums.length - 1, mid;
int[] rel = {-1, -1};
while (l <= r) {
mid = (l + r) / 2;
if (nums[mid] > target) {
r = mid - 1;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
rel[0] = mid;
r = mid - 1;
}
}
l = 0;
r = nums.length - 1;
while (l <= r) {
mid = (l + r) / 2;
if (nums[mid] > target) {
r = mid - 1;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
rel[1] = mid;
l = mid + 1;
}
}
return rel;
}
}
开头可以加上下面这行,避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算。
if (target < nums[0] || target > nums[nums.length - 1]) { return -1; }
题解中还有一种常见方法,写一个二分查找的函数,分别调用两次以查找target和target+1得到左右边界,代码更简洁,但时间复杂度一样。