返回

渐入佳境:LeetCode 34 算法指南,寻找排序数组中目标元素的边界

闲谈

在算法世界中,搜索问题占据着至关重要的地位。在众多搜索算法中,二分查找算法以其卓越的效率脱颖而出。LeetCode 34 算法挑战要求我们运用二分查找算法,在排序数组中精确定位目标元素的第一个和最后一个位置。本指南将循序渐进地解析这一算法,帮助您轻松掌握它的奥秘。

前奏:二分查找算法

二分查找算法适用于已排序的数组,通过不断缩小搜索范围来快速定位目标元素。其基本思想是:将数组分成两半,判断目标元素可能存在于哪一半,然后继续在较小的那一半中执行同样的操作,直至找到目标元素或确定其不存在。

LeetCode 34 算法详解

LeetCode 34 算法的任务是在排序数组 nums 中查找目标元素 target 的第一个和最后一个位置。具体步骤如下:

  1. 初始化搜索范围 :将数组索引的左边界和右边界分别设为 0 和 nums.length - 1

  2. 循环二分查找

    • 计算数组的中间索引 mid
    • 比较 nums[mid]target
      • 如果 nums[mid] < target,则目标元素一定在 [mid + 1, right] 范围内,更新左边界为 mid + 1
      • 如果 nums[mid] > target,则目标元素一定在 [left, mid - 1] 范围内,更新右边界为 mid - 1
      • 如果 nums[mid] == target,则我们找到了一个潜在的边界。记录当前 mid 值,并同时在 [left, mid - 1][mid + 1, right] 范围内继续二分查找,以寻找目标元素的另一个边界。
  3. 处理结果

    • 如果找到了目标元素,则返回其第一个和最后一个位置。
    • 如果没有找到目标元素,则返回 [-1, -1]

代码实现

以下是 LeetCode 34 算法的 Java 代码实现:

public int[] searchRange(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] < target) {
            left = mid + 1;
        } else if (nums[mid] > target) {
            right = mid - 1;
        } else {
            int start = mid, end = mid;
            while (start >= 0 && nums[start] == target) {
                start--;
            }
            while (end < nums.length && nums[end] == target) {
                end++;
            }
            return new int[]{start + 1, end - 1};
        }
    }
    return new int[]{-1, -1};
}

拓展延伸

二分查找算法在实际应用中有着广泛的应用,例如:

  • 二叉搜索树查找 :二分查找算法可以用来在二叉搜索树中高效地查找元素。
  • 区间查询 :二分查找算法可以用于在排序数组中查找指定范围内的元素。
  • 最大值最小值查询 :二分查找算法可以用于在排序数组中查找最大值或最小值。

结语

LeetCode 34 算法通过运用二分查找算法,为查找排序数组中目标元素的边界提供了一种高效的解决方案。本指南详细讲解了算法的步骤、代码实现以及实际应用,希望它能帮助您深刻理解这一经典算法。通过不断练习和探索,您一定能掌握二分查找算法的精髓,成为算法世界中的探险家。