什么是旋转数组中的二分查找?
旋转数组 是一个原本单调递增的数组,经过若干次循环左移后得到的数组。
例如原数组 [1, 3, 5, 7, 9, 12, 15] 循环左移 3 位后变为 [7, 9, 12, 15, 1, 3, 5]。
虽然整体不再有序,但数组被“旋转点”分成两段,每段内部仍然分别有序。利用这一特性,我们依然可以用 二分查找 在 O(log n) 时间内找到目标值。
核心思路:每次取中间元素,先判断哪一半是“有序”的,再判断目标值是否落在该有序半区内,从而排除另一半。
旋转数组:整体非有序,但旋转点左右各有一段有序区间
交互演示与代码
旋转数组二分查找
在循环左移后的有序数组中查找目标值。每次通过比较中间元素与边界元素,确定哪一半区间是有序的,并判断目标值是否位于该区间内。
自定义测试数据:
中间位置 m
当前搜索范围 [i, j]
已知有序半区
已排除
找到目标
Step 1:
初始化...
Python 实现
rotated_binary_search.py
关键点思考:
旋转数组的关键在于:每次比较 a[i] 与 a[m],确定左半部分 [i, m] 和右半部分 [m, j] 哪一个仍然保持单调递增,然后只在包含目标值的那一半继续查找。