返回

LeetCode 33. 搜索旋转排序数组:告别繁琐的条件判断,直击旋转数组的精髓

闲谈

旋转数组的挑战

旋转数组是指将一个有序数组循环右移任意次,形成一个新的数组。例如,将数组 [1, 2, 3, 4, 5] 右移两次,得到 [4, 5, 1, 2, 3]。在旋转数组中搜索元素,需要考虑数组的旋转性质,否则容易陷入复杂而冗长的条件判断。

二分查找的巧妙应用

解决旋转数组搜索问题的关键在于巧妙地应用二分查找算法。二分查找是一种高效的搜索算法,它通过不断缩小搜索范围来快速找到目标元素。在旋转数组中,我们利用二分查找的原理,将数组划分为两部分,并在适当的时候舍弃一部分,从而快速找到目标元素。

直击精髓的解决方案

下面是 LeetCode 33. 搜索旋转排序数组 的详细解决方案:

  1. 首先,检查数组是否为空。如果为空,则返回 -1。
  2. 计算数组的中点索引 mid。
  3. 比较 nums[mid] 和 target 的大小。
  4. 如果 nums[mid] 等于 target,则返回 mid。
  5. 如果 nums[mid] 小于 target,则说明目标元素在右半部分。将左边界设置为 mid + 1。
  6. 如果 nums[mid] 大于 target,则说明目标元素在左半部分。将右边界设置为 mid - 1。
  7. 重复步骤 2 到 6,直到找到目标元素或搜索范围缩小到只有一个元素。

代码实现

def search(nums, target):
  """
  在旋转排序数组中搜索目标元素。

  参数:
    nums:旋转排序数组
    target:目标元素

  返回值:
    如果找到目标元素,则返回其索引。否则,返回 -1。
  """

  # 检查数组是否为空
  if not nums:
    return -1

  # 计算数组的中点索引
  left, right = 0, len(nums) - 1

  # 循环搜索
  while left <= right:
    mid = (left + right) // 2

    # 比较 nums[mid] 和 target 的大小
    if nums[mid] == target:
      return mid
    elif nums[mid] < target:
      left = mid + 1
    else:
      right = mid - 1

  # 未找到目标元素
  return -1

结语

通过巧妙地应用二分查找算法,我们可以直击旋转数组的精髓,轻松解决 LeetCode 33. 搜索旋转排序数组 问题。这种方法简洁优雅,避免了繁琐的条件判断,让我们能够更深入地理解旋转数组的本质。希望本文能够对您的算法之旅有所帮助!