返回

用二分查找解决LeetCode每日一题,持续提升编程技能

见解分享

掌握 LeetCode 每日一题,提升你的编程功力

探索算法精髓,解题捷径就在二分法

在算法的世界里,解决问题的效率至关重要。对于 LeetCode 每日一题,二分查找算法就是你的制胜法宝。二分查找算法就像是一位武功高手,它能以迅雷不及掩耳之势找到你寻觅的答案。

二分查找算法:庖丁解牛

二分查找算法的目标是在有序数组中快速找到一个元素。它通过反复将搜索范围缩小一半来实现这一目标。算法首先检查数组中点的元素是否等于目标值。如果相等,那么恭喜你,目标已找到!如果不相等,算法根据目标值和中值的大小,判断目标值可能位于数组的前半部分还是后半部分。然后,它继续在这个缩小的范围内重复这个过程,直到找到目标值或者确定它不在数组中。

LeetCode 每日一题实战

假设你今天遇到的 LeetCode 每日一题是这样的:

给定一个有序数组 nums 和一个目标值 target,找出 target 在数组中的起始位置和结束位置。如果 target 不在数组中,返回 [-1, -1]

例如:

nums = [5,7,7,8,8,10]
target = 8
输出: [3, 4]

使用二分查找算法,你可以这样解决这个问题:

  1. 初始化 left 指针为 0right 指针为 nums.length - 1
  2. 循环执行以下步骤,直到 left 大于或等于 right
    • 计算数组中点 mid = (left + right) // 2
    • 如果 nums[mid] == target,则目标已找到。
    • 如果 nums[mid] < target,则目标一定在数组的后半部分,所以更新 left = mid + 1
    • 如果 nums[mid] > target,则目标一定在数组的前半部分,所以更新 right = mid - 1
  3. 如果在循环中没有找到目标,返回 [-1, -1]

代码示例

以下是使用 Python 实现二分查找算法的代码示例:

def find_target_range(nums, target):
  """
  Finds the start and end positions of a target value in a sorted array.

  Args:
    nums (list): A sorted list of integers.
    target (int): The target value to search for.

  Returns:
    tuple: A tuple containing the start and end positions of the target value.
  """

  left, right = 0, len(nums) - 1

  while left <= right:
    mid = (left + right) // 2

    if nums[mid] == target:
      # Found the target value. Now find its start and end positions.
      start, end = mid, mid

      # Move left to find the start position.
      while start >= 0 and nums[start] == target:
        start -= 1

      # Move right to find the end position.
      while end < len(nums) and nums[end] == target:
        end += 1

      return start + 1, end - 1
    elif nums[mid] < target:
      # Target value is in the right half.
      left = mid + 1
    else:
      # Target value is in the left half.
      right = mid - 1

  # Target value not found.
  return -1, -1

效率分析

二分查找算法的时间复杂度为 O(log n),其中 n 是数组 nums 的长度。这是因为算法每次迭代都会将搜索范围缩小一半。空间复杂度为 O(1),因为算法是原位的,不需要创建任何额外的数据结构。

结语

掌握二分查找算法,你就能轻松应对 LeetCode 每日一题。通过持续解题,你将磨练你的算法技能、解决问题的能力和编程能力。记住,在编程的世界里,效率就是一切,而二分查找算法就是你的秘密武器。

常见问题解答

  1. 为什么二分查找算法比线性查找算法更有效率?
    因为二分查找算法的时间复杂度是 O(log n),而线性查找算法的时间复杂度是 O(n)。随着数组大小的增大,二分查找算法的效率优势会更加明显。
  2. 二分查找算法适用于哪些问题?
    二分查找算法适用于有序数组中查找元素的问题。它还可以用于解决诸如查找最小值、最大值和中位数等问题。
  3. 如何将二分查找算法应用于实际场景?
    二分查找算法可以用于各种实际场景,例如:
    • 在字典中查找单词
    • 在列表中查找联系人
    • 在数据库中查找记录
  4. 二分查找算法有哪些变种?
    二分查找算法有一些变种,例如插值查找和斐波那契查找。这些变种在某些情况下可以提高效率。
  5. 二分查找算法的局限性是什么?
    二分查找算法的局限性是它要求数组必须是有序的。如果数组是无序的,二分查找算法将无法正常工作。