Python
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
n = len(nums)
start = self.lower_bound(nums, 0, n-1, target)
end = self.lower_bound(nums, 0, n-1, target + 1) - 1
return [-1, -1] if start > end else [start, end]
def lower_bound(self, nums, l, r, target): # 寻找 >= target的第一个数!!!
while l <= r:
mid = (l + r) // 2
if nums[mid] < target:
l = mid + 1
else:
r = mid - 1
return l
Java
法1:二分查找
注意:寻找完边界后,要判断两者是否合法!!!
class Solution {
public int[] searchRange(int[] nums, int target) {
if (nums.length == 0) {
return new int[]{-1, -1};
}
int leftBound = findLeftBound(nums, target, 0, nums.length - 1);
int rightBound = findRightBound(nums, target, 0, nums.length - 1);
if (leftBound <= rightBound) {
return new int[]{leftBound, rightBound};
}
return new int[]{-1, -1};
}
public int findLeftBound(int[] nums, int target, int left, int right) {
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return left;
}
public int findRightBound(int[] nums, int target, int left, int right) {
int mid = 0;
while (left <= right) {
mid = left + (right - left) / 2;
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return right;
}
}