返回

LeetCode 33. 搜索旋转排序数组

前端

前言

在 LeetCode 的众多算法题中,有一道经典题——LeetCode 33:搜索旋转排序数组。这道题考察了我们在面对旋转排序数组时如何进行二分查找,从而快速找到目标元素。

题目

给定一个整数数组 nums,该数组由一个按升序排列的数组旋转而成,请你在该数组中找到目标元素 target。如果数组中存在这个目标元素,则返回它的索引,否则返回 -1。

算法步骤

  1. 定义两个指针:left 指向数组的开头,right 指向数组的末尾。

  2. 在 left 和 right 之间进行二分查找。

  3. 计算中间位置 mid。

  4. 如果 nums[mid] 等于 target,则返回 mid。

  5. 如果 nums[left] 到 nums[mid] 是升序排列的:

    • 如果 target 在该区间内,则将 right 更新为 mid - 1。

    • 否则,将 left 更新为 mid + 1。

  6. 如果 nums[mid] 到 nums[right] 是升序排列的:

    • 如果 target 在该区间内,则将 left 更新为 mid + 1。

    • 否则,将 right 更新为 mid - 1。

  7. 重复步骤 2 到 6,直到 left 和 right 相交。

  8. 如果此时 left 和 right 相交,则表明数组中不存在 target,返回 -1。

示例

以下是一个示例,展示了如何使用二分查找算法在旋转排序数组中查找目标元素。

def search(nums, target):
    left, right = 0, len(nums) - 1

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

        if nums[mid] == target:
            return mid

        if nums[left] <= nums[mid]:
            if target >= nums[left] and target < nums[mid]:
                right = mid - 1
            else:
                left = mid + 1
        else:
            if target > nums[mid] and target <= nums[right]:
                left = mid + 1
            else:
                right = mid - 1

    return -1


nums = [4, 5, 6, 7, 0, 1, 2]
target = 0

result = search(nums, target)

print(result)  # 输出:4

总结

在 LeetCode 33:搜索旋转排序数组这道题中,我们使用二分查找算法来解决问题。这种算法的优势在于它的时间复杂度为 O(log n),在大多数情况下都能快速找到目标元素。