返回

二分查找快速定位目标元素位置,掌握方法轻而易举!

后端

二分查找是一种经典的搜索算法,可以在对数时间内查找数组中指定的目标元素。它特别适用于处理已排序的数组,可以极大地提高查找效率。

二分查找的原理

二分查找的原理很简单,它利用数组的排序特性,通过不断地将数组一分为二,将目标元素的搜索范围缩小,从而加快查找速度。具体步骤如下:

  1. 从数组的中间位置(记为mid)开始,将mid处的元素与目标元素进行比较。
  2. 如果mid处的元素等于目标元素,则找到目标元素,返回mid作为目标元素的索引。
  3. 如果mid处的元素大于目标元素,则目标元素肯定在数组的左半部分,将右边界更新为mid-1,然后重复步骤1和2。
  4. 如果mid处的元素小于目标元素,则目标元素肯定在数组的右半部分,将左边界更新为mid+1,然后重复步骤1和2。

不断重复步骤1到4,直到找到目标元素或搜索范围为空(即左边界大于右边界)为止。

实现二分查找

在LeetCode题目34中,我们要求在排序数组中查找元素的第一个和最后一个位置。我们可以通过对二分查找算法进行一些修改来实现这个功能。具体步骤如下:

  1. 使用二分查找算法在数组中找到目标元素的第一个位置。
  2. 在找到第一个位置之后,继续在数组中搜索目标元素的最后一个位置。在每次搜索中,将左边界更新为mid+1,并将右边界保持不变。
  3. 重复步骤2,直到找到目标元素的最后一个位置或搜索范围为空。

通过这种方法,我们可以同时找到目标元素的第一个和最后一个位置。

代码示例

以下是LeetCode题目34的Python代码实现:

def find_range(nums, target):
  """
  在排序数组中查找元素的第一个和最后一个位置。

  Args:
    nums: 排序数组。
    target: 目标元素。

  Returns:
    一个包含第一个和最后一个位置的元组。
  """

  # 初始化左右边界。
  left = 0
  right = len(nums) - 1

  # 使用二分查找算法找到第一个位置。
  while left <= right:
    mid = (left + right) // 2
    if nums[mid] == target:
      # 找到了第一个位置。
      first_index = mid
      # 将右边界更新为mid-1,以便在下一个循环中查找最后一个位置。
      right = mid - 1
    elif nums[mid] < target:
      # 目标元素在数组的右半部分。
      left = mid + 1
    else:
      # 目标元素在数组的左半部分。
      right = mid - 1

  # 使用二分查找算法找到最后一个位置。
  while left <= right:
    mid = (left + right) // 2
    if nums[mid] == target:
      # 找到了最后一个位置。
      last_index = mid
      # 将左边界更新为mid+1,以便在下一个循环中查找最后一个位置。
      left = mid + 1
    elif nums[mid] < target:
      # 目标元素在数组的右半部分。
      left = mid + 1
    else:
      # 目标元素在数组的左半部分。
      right = mid - 1

  # 返回第一个和最后一个位置。
  return first_index, last_index


if __name__ == "__main__":
  # 测试代码。
  nums = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
  target = 5
  first_index, last_index = find_range(nums, target)
  print("第一个位置:", first_index)
  print("最后一个位置:", last_index)

总结

在本文中,我们详细讨论了LeetCode题目34的解法,并提供了详细的代码示例。通过对二分查找算法的讲解和实现,我们帮助您理解如何在排序数组中高效定位目标元素的位置。同时,我们还提供了一些实用的技巧和建议,让您在学习和应用二分查找算法时更加得心应手。希望您能通过本文掌握二分查找算法的基本原理和实现方法,并在实际应用中灵活运用它。