返回

LeetCode 探索之旅:深入 JavaScript 攻克第 33 到 34 题,掌握搜索区间算法精髓

前端

算法简介:搜索区间

在 LeetCode 的算法天地中,搜索区间算法犹如一把利器,助您轻松找到目标值在有序数组中的位置范围。算法的核心思想是二分查找,它通过不断缩小搜索范围,快速定位目标值。

LeetCode 33:搜索旋转排序数组

LeetCode 33 题带您进入一个旋转排序数组的世界。在这个数组中,元素被旋转了某个未知的位置,就像一个圆环一样。您的任务是找到目标值在这个旋转数组中的起始位置和结束位置。

LeetCode 34:在排序数组中查找元素的第一个和最后一个位置

LeetCode 34 题延续了搜索区间算法的探索之旅,但这一次,您需要在有序数组中找到目标值出现的第一个和最后一个位置。在这个过程中,您将更加深入地理解二分查找算法的妙用。

JavaScript 解题思路

LeetCode 33:

  1. 将旋转数组视为两个有序数组的组合。
  2. 找到旋转点,即数组被旋转的位置。
  3. 在两个有序数组中分别使用二分查找算法搜索目标值。

LeetCode 34:

  1. 使用二分查找算法找到目标值在有序数组中的位置。
  2. 向左和向右扩展搜索范围,直到找到目标值的第一个和最后一个位置。

代码实现:

LeetCode 33:

function search(nums, target) {
  let left = 0, right = nums.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] === target) {
      // 搜索目标值左侧边界
      let start = mid - 1;
      while (start >= 0 && nums[start] === target) {
        start--;
      }
      // 搜索目标值右侧边界
      let end = mid + 1;
      while (end < nums.length && nums[end] === target) {
        end++;
      }
      return [start + 1, end - 1];
    } else if (nums[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return [-1, -1];
}

LeetCode 34:

function searchRange(nums, target) {
  let left = 0, right = nums.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] === target) {
      // 搜索目标值左侧边界
      let start = mid - 1;
      while (start >= 0 && nums[start] === target) {
        start--;
      }
      // 搜索目标值右侧边界
      let end = mid + 1;
      while (end < nums.length && nums[end] === target) {
        end++;
      }
      return [start + 1, end - 1];
    } else if (nums[mid] < target) {
      left = mid + 1;
    } else {
      right = mid - 1;
    }
  }
  return [-1, -1];
}

总结

通过 LeetCode 33 和 34 题的探索,您已掌握了搜索区间算法的精髓。在未来的 LeetCode 征途上,您将不断磨砺算法技能,不断突破编程的界限。

希望这篇文章能为您的 LeetCode 之旅增添光彩。让我们一起在算法的世界中乘风破浪,不断超越自我!