返回
LeetCode 33. 搜索旋转排序数组
前端
2023-12-15 09:18:12
前言
在 LeetCode 的众多算法题中,有一道经典题——LeetCode 33:搜索旋转排序数组。这道题考察了我们在面对旋转排序数组时如何进行二分查找,从而快速找到目标元素。
题目
给定一个整数数组 nums,该数组由一个按升序排列的数组旋转而成,请你在该数组中找到目标元素 target。如果数组中存在这个目标元素,则返回它的索引,否则返回 -1。
算法步骤
-
定义两个指针:left 指向数组的开头,right 指向数组的末尾。
-
在 left 和 right 之间进行二分查找。
-
计算中间位置 mid。
-
如果 nums[mid] 等于 target,则返回 mid。
-
如果 nums[left] 到 nums[mid] 是升序排列的:
-
如果 target 在该区间内,则将 right 更新为 mid - 1。
-
否则,将 left 更新为 mid + 1。
-
-
如果 nums[mid] 到 nums[right] 是升序排列的:
-
如果 target 在该区间内,则将 left 更新为 mid + 1。
-
否则,将 right 更新为 mid - 1。
-
-
重复步骤 2 到 6,直到 left 和 right 相交。
-
如果此时 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),在大多数情况下都能快速找到目标元素。