难度:⭐⭐
解题关键词:二分查找
解题思路:使用二分查找到 target 的位置,然后向左向右探索,找到最小和最大的两个索引,即为第一次和最后一次出现的索引。
typescript
function searchRange(nums: number[], target: number): number[] {
let left = 0;
let right = nums.length - 1;
let startIndex = -1;
let endIndex = -1;
while (left <= right) {
const mid = Math.floor((right - left) / 2) + left;
// 如果找到了 target,就直接 break
if (nums[mid] === target) {
startIndex = startIndex === -1 ? mid : Math.min(startIndex, mid);
endIndex = Math.max(endIndex, mid);
break;
} else if (nums[mid] > target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
// 向左探索,找到等于 target 的最小索引
while (startIndex !== -1) {
if (nums[startIndex - 1] === target) {
startIndex--;
} else {
break;
}
}
// 向右探索,找到等于 target 的最大索引
while (endIndex !== -1) {
if (nums[endIndex + 1] === target) {
endIndex++;
} else {
break;
}
}
return [startIndex, endIndex];
}