Skip to content

力扣链接:34.在排序数组中查找元素的第一个和最后一个位置

难度:⭐⭐

解题关键词:二分查找

解题思路:使用二分查找到 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];
}