二分查找实战:旋转数组最小值与缺失数字
二分查找是算法面试中的高频考点,掌握其变体应用往往能解决看似复杂的排序问题。本文通过两个经典例题,深入剖析如何利用二分查找的'二段性'优化时间复杂度。
23. 寻找旋转排序数组中的最小值
题目描述
已知一个长度为 n 的升序数组,在某个未知的下标 k 处进行了旋转(例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。请找出其中最小的元素。
算法思路
旋转后的数组可以看作两段有序序列。核心在于找到分界点。我们利用二分查找的特性,每次将搜索区间减半。
观察图像可知,数组分为两部分:
- 前半部分(A-B):所有元素均大于等于最后一个元素 D。
- 后半部分(C-D):所有元素均小于等于最后一个元素 D。
因此,我们可以选择 nums[right] 作为参照物:
- 若
mid的值大于right端的值,说明mid落在前半部分,最小值一定在mid右侧,令left = mid + 1。 - 若
mid的值小于等于right端的值,说明mid落在后半部分,最小值可能是mid或在mid左侧,令right = mid。
当 left == right 时,即找到了最小值。

C++ 实现代码
这里提供两种常见的比较策略,推荐第一种(以右端点为参照),逻辑更直观。
策略一:以 nums[n - 1] 为参照物
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0;
int right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] > nums[nums.size() - 1]) {
left = mid + ;
} {
right = mid;
}
}
nums[left];
}
};




