返回

二分查找法:全面掌握数组搜索技巧

后端

二分查找法:征服 LeetCode 有序数组的利器

掌握二分查找法,解锁 LeetCode 成功秘诀

对于 LeetCode 初学者来说,二分查找法可谓是解题的利器之一。掌握了它,你就能轻松征服有序数组搜索问题,为刷题之路保驾护航。在这篇文章中,我们将深入探讨两种二分查找法的使用技巧,并通过详细的代码示例让你快速上手。

标准二分查找法:简单高效

标准二分查找法遵循这样一个原则:将有序数组一分为二,比较中间元素与目标值。如果中间元素等于目标值,就找到了答案;如果小于目标值,就在数组的后半部分继续查找;如果大于目标值,就在数组的前半部分继续查找。

代码示例:

public static int binarySearch(int[] arr, int target) {
    int low = 0;
    int high = arr.length - 1;

    while (low <= high) {
        int mid = (low + high) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

    return -1;
}

带边界的二分查找法:解决边界问题

在实际应用中,数组的边界可能会给我们带来一些麻烦。标准二分查找法无法处理目标值不在数组中的情况,因此我们需要引入带边界的二分查找法。

改进之处:

  • 在查找过程中,始终确保边界值不会越界。
  • 当只剩下最后一个元素时,如果它等于目标值,就返回索引;否则,返回-1。

代码示例:

public static int binarySearchWithBounds(int[] arr, int target) {
    int low = 0;
    int high = arr.length - 1;

    while (low <= high) {
        int mid = (low + high) / 2;

        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }

        if (low > high) {
            return -1;
        }
    }

    return -1;
}

常见问题解答

  1. 什么时候使用标准二分查找法,什么时候使用带边界的二分查找法?
  • 标准二分查找法适用于目标值肯定在数组中的情况。
  • 带边界的二分查找法适用于目标值可能不在数组中的情况。
  1. 如果数组中有多个目标值,二分查找法还能正常工作吗?
  • 是的,二分查找法仍然能找到目标值中的第一个。
  1. 二分查找法的平均时间复杂度是多少?
  • O(log n),其中 n 是数组的长度。
  1. 二分查找法可以应用于哪些数据结构?
  • 有序数组、链表、平衡树。
  1. 二分查找法在解决哪些问题上最有效?
  • 查找元素、寻找插入点、寻找最近元素、求极值。

结语

掌握二分查找法,LeetCode 中的有序数组搜索问题将不再成为你的绊脚石。通过理解两种二分查找法的原理和代码实现,你将能够高效地解决这些问题,为刷题之路增添更多信心和乐趣。祝你在 LeetCode 上取得佳绩!