二分查找实战:旋转排序数组最小值与点名问题
二分查找不仅是基础算法,更是处理有序数据的高效利器。本文将通过两道经典题目,深入剖析如何利用'二段性'思想优化查找逻辑。
1. 寻找旋转排序数组中的最小值
题目描述
已知一个长度为 n 的升序数组,经过 1 到 n 次旋转后得到输入数组。例如 [3,4,5,1,2] 是 [1,2,3,4,5] 旋转后的结果。请找出其中的最小元素。

解题思路
旋转后的数组可以看作由两个有序子数组组成,且前一部分的所有元素都大于等于后一部分的元素。最小值恰好位于这两个部分的交界处。
我们可以利用二分查找来定位这个分界点。核心在于确定 mid 落在哪个区间:
- 如果
nums[mid]大于等于起始元素nums[0],说明mid落在左半部分(较大值区域),最小值一定在右侧。 - 如果
nums[mid]小于nums[0],说明mid落在右半部分(较小值区域),最小值可能在左侧或就是mid本身。
当左右指针相遇时,即找到了最小值。
代码实现
class Solution {
public:
int findMin(vector<int>& nums) {
int n = nums.size();
int left = 0, right = n - 1;
// 如果数组没有旋转,直接返回第一个元素
if (nums[0] <= nums[n - 1]) {
return nums[0];
}
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] >= nums[0]) {
left = mid + 1;
} {
right = mid;
}
}
nums[left];
}
};



