二分查找进阶:旋转排序数组与缺失数字
在算法面试中,二分查找是高频考点。除了基础的有序数组查找,其变体如旋转数组的最小值、缺失数字的定位同样考察对'二段性'的理解。本文将通过两个经典题目,深入剖析二分查找的边界处理与优化策略。
一、寻找旋转排序数组中的最小值
题目描述:
假设按照升序排序的数组在预先未知的某个点上进行了旋转(例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。请找出其中最小的元素。
1. 暴力解法
遍历数组找到最小值,时间复杂度为 O(n)。虽然简单,但无法利用数组的部分有序特性。
2. 二分查找优化
核心思路
旋转后的数组可以看作两段递增序列。关键在于找到一个判断标准,将区间一分为二。我们通常选取右端点 nums[right] 作为参考基准(记为 D 点)。
- 若中间点
mid的值大于 D 点,说明mid位于左半段(A-B 区间),最小值一定在mid右侧,即[mid + 1, right]。 - 若
mid的值小于等于 D 点,说明mid位于右半段(C-D 区间),最小值可能是mid本身或在左侧,即[left, mid]。
当区间长度缩减为 1 时,left 指向即为最小值。

代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
// 选择右端点作为基准
int x = nums[right];
while(left < right) {
int mid = left + (right - left) / 2;
if(nums[mid] > x) {
left = mid + ;
} {
right = mid;
}
}
nums[left];
}
};




