二分查找进阶:两个经典场景解析
二分查找不仅仅是找固定值,在特定约束下,它还能解决更复杂的问题。今天通过两道高频面试题,深入探讨如何利用'二段性'优化搜索策略。
1. 寻找旋转排序数组中的最小值
题目背景
给定一个升序排列的数组,经过若干次旋转后(例如 [0,1,2,4,5,6,7] 变为 [4,5,6,7,0,1,2]),请找出其中的最小元素。

核心思路
旋转后的数组可以看作两段递增序列。关键在于找到分界点。我们不需要遍历整个数组,利用二分法可以将复杂度降为 O(logN)。
观察图像可以发现规律:
- 左半部分(A 到 B)的元素通常大于右半部分的最后一个元素 D。
- 右半部分(C 到 D)的元素小于等于 D。
- C 点即为最小值。
判断逻辑:
初始化左右指针 left 和 right。计算中点 mid:
- 若
nums[mid] > nums[right],说明mid落在左半段递增区间,最小值一定在mid右侧,更新left = mid + 1。 - 若
nums[mid] <= nums[right],说明mid落在右半段或就是最小值本身,最小值在左侧或即为mid,更新right = mid。 当left == right时,即锁定目标。
代码实现(以右端点为参照)
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 + 1;
} else {
right = mid;
}
}
nums[left];
}
};





