Run two separate binary searches: one to find the leftmost boundary of the target value, and another to find the rightmost boundary.
class Solution:
def searchRange(self, nums: List[int], target: int) -> List[int]:
def binarySearch(isFirst):
l, r = 0, len(nums) - 1
res = -1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
res = mid
if isFirst:
r = mid - 1
else:
l = mid + 1
elif nums[mid] < target:
l = mid + 1
else:
r = mid - 1
return res
return [binarySearch(True), binarySearch(False)]
class Solution {
public int[] searchRange(int[] nums, int target) {
int[] result = new int[2];
result[0] = findFirst(nums, target);
result[1] = findLast(nums, target);
return result;
}
private int findFirst(int[] nums, int target) {
int l = 0, r = nums.length - 1;
int res = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
res = mid;
r = mid - 1;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return res;
}
private int findLast(int[] nums, int target) {
int l = 0, r = nums.length - 1;
int res = -1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (nums[mid] == target) {
res = mid;
l = mid + 1;
} else if (nums[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return res;
}
}