数据结构与算法之 leetcode 二分查找旋转数组极值算法 二分法

数据结构与算法阿木 发布于 2025-07-12 12 次阅读


二分查找旋转数组极值算法(二分法)详解

在处理旋转数组时,二分查找算法是一种非常高效的方法。旋转数组是指一个数组先进行了一次整体旋转,例如将数组 `[1, 2, 3, 4, 5, 6, 7]` 旋转成 `[6, 7, 1, 2, 3, 4, 5]`。在这种数组中,寻找最大值或最小值的问题可以通过二分查找算法来解决。本文将详细介绍如何使用二分查找算法来找到旋转数组中的极值。

旋转数组概述

旋转数组通常由两部分组成:一部分是升序的,另一部分是降序的。例如,数组 `[6, 7, 1, 2, 3, 4, 5]` 可以分为 `[6, 7]` 和 `[1, 2, 3, 4, 5]`。在寻找极值时,我们需要确定哪一部分是升序的,然后在该部分内使用二分查找。

二分查找算法

二分查找算法是一种在有序数组中查找特定元素的搜索算法。其基本思想是将待查找的区间分成两半,然后根据目标值与区间两端的比较结果,缩小查找范围。以下是二分查找算法的基本步骤:

1. 确定查找区间的起始位置 `low` 和结束位置 `high`。

2. 计算中间位置 `mid`。

3. 比较中间位置的元素与目标值:

- 如果中间位置的元素等于目标值,则查找成功。

- 如果中间位置的元素小于目标值,则将查找区间缩小到右半部分。

- 如果中间位置的元素大于目标值,则将查找区间缩小到左半部分。

4. 重复步骤2和3,直到找到目标值或区间缩小到0。

旋转数组极值算法

在旋转数组中,我们可以通过以下步骤来找到极值:

1. 初始化 `low` 和 `high` 为数组的起始和结束索引。

2. 当 `low` 小于等于 `high` 时,执行以下步骤:

- 计算中间位置 `mid`。

- 比较中间位置的元素与 `nums[low]` 和 `nums[high]`:

- 如果 `nums[mid]` 大于 `nums[low]`,则极值在左半部分,将 `high` 更新为 `mid - 1`。

- 如果 `nums[mid]` 小于 `nums[high]`,则极值在右半部分,将 `low` 更新为 `mid + 1`。

- 如果 `nums[mid]` 等于 `nums[low]` 或 `nums[mid]` 等于 `nums[high]`,则无法确定极值所在位置,随机选择 `low` 或 `high` 减小查找范围。

3. 当 `low` 大于 `high` 时,循环结束,此时 `low` 的位置即为极值的位置。

代码实现

以下是使用二分查找算法在旋转数组中寻找极值的 Python 代码实现:

python

def findPeakElement(nums):


low, high = 0, len(nums) - 1


while low <= high:


mid = (low + high) // 2


if (mid == 0 or nums[mid] > nums[mid - 1]) and (mid == len(nums) - 1 or nums[mid] > nums[mid + 1]):


return mid


elif nums[mid] < nums[high]:


low = mid + 1


else:


high = mid - 1


return -1

测试代码


nums = [6, 7, 1, 2, 3, 4, 5]


print(findPeakElement(nums)) 输出:4


总结

本文详细介绍了如何使用二分查找算法在旋转数组中寻找极值。通过分析旋转数组的特性,我们能够有效地缩小查找范围,从而提高算法的效率。在实际应用中,这种算法可以用于解决许多与旋转数组相关的问题,例如寻找旋转数组中的最小值、最大值、查找特定元素等。