原题出处:https://chat.openai.com/chat/77b99a7c-e89d-4a64-bbb0-e20906b1c3e5
解法一:
class Solution {
public int[] searchRange(int[] nums, int target) {
int left = binarySearchLeft(nums, target);
int right = binarySearchRight(nums, target);
if (left <= right) {
return new int[]{left, right};
} else {
return new int[]{-1, -1};
}
}
private int binarySearchLeft(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] < target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
return left;
}
private int binarySearchRight(int[] nums, int target) {
int left = 0, right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
return right;
}
}
思路:
这是一个典型的二分查找问题。我们可以分别找到目标值在数组中第一次出现和最后一次出现的位置,这样就能得到目标值在数组中的开始位置和结束位置。
具体地,我们可以先使用二分查找找到目标值在数组中的任意一个位置,然后分别向左和向右扩展,直到找到目标值第一次出现和最后一次出现的位置。
时间复杂度:O(log n),其中 n 是数组的长度。每次二分查找可以将查找范围减少一半,因此总共需要进行 O(log n) 次查找。