返回

LeetCode 34:在升序数组中锁定目标值的踪迹

后端

二分查找的精髓

二分查找是计算机科学中一种快速而有效的搜索算法,它反复将搜索范围对半分,直到找到目标值。这种方法基于数组是有序的前提,因此可以有效地缩小搜索范围。

LeetCode 34 问题要求我们在升序数组中找到目标值的第一个和最后一个位置。我们使用二分查找算法,首先将数组划分为左右两半,比较目标值与数组中间元素的大小。

public int[] searchRange(int[] nums, int target) {
    int[] range = new int[]{-1, -1};
    int left = 0;
    int right = nums.length - 1;

    // 查找目标值的第一个位置
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            range[0] = mid;
            right = mid - 1;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    // 查找目标值的最后一个位置
    left = 0;
    right = nums.length - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            range[1] = mid;
            left = mid + 1;
        } else if (nums[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }

    return range;
}

细致入微的边界处理

在二分查找算法中,边界条件的处理非常重要。为了避免数组越界,我们使用 while (left <= right) 作为循环条件。在查找目标值的第一个位置时,如果中间元素等于目标值,我们就将 right 更新为 mid - 1,因为我们正在寻找第一个位置,所以我们需要在左边继续搜索。

在查找目标值的最后一个位置时,如果中间元素等于目标值,我们就将 left 更新为 mid + 1,因为我们正在寻找最后一个位置,所以我们需要在右边继续搜索。

算法的复杂度分析

二分查找算法的时间复杂度为 O(log n),其中 n 是数组的长度。这是因为每次迭代都会将搜索范围缩小一半,因此搜索范围将呈指数级减少。

结语

LeetCode 34 问题的解决过程不仅锻炼了我们的算法思维,也加深了我们对二分查找算法的理解。这种算法的广泛应用性,使得掌握其原理和技巧变得尤为重要。希望本文能帮助您进一步掌握二分查找算法的精髓,并在未来的编程挑战中脱颖而出!