二分查找实战:旋转排序数组最小值与点名问题
23. 寻找旋转排序数组中的最小值
题目描述
给定一个按照升序排列的整数数组 nums,该数组在预先未知的某个点上进行了旋转(例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2])。请找出其中最小的元素。
算法思路
这道题的核心在于利用旋转数组的二段性。虽然整体无序,但局部是有序的。我们可以将数组分为两部分:一部分严格大于等于首元素,另一部分小于首元素。最小值就位于这两部分的交界处。
初始化左右指针 left 和 right,通过计算中点 mid 来判断当前处于哪一段:
- 如果
nums[mid] >= nums[0],说明mid落在前半段(较大值区间),最小值一定在右侧,因此收缩左边界为mid + 1。 - 如果
nums[mid] < nums[0],说明mid落在后半段(较小值区间),最小值可能在当前位置或左侧,因此收缩右边界为mid。
当 left == right 时,即锁定最小值位置。注意处理特殊情况:如果数组本身没有旋转(即 nums[0] <= nums[n-1]),直接返回首元素。

C++ 代码实现
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[]) {
left = mid + ;
} {
right = mid;
}
}
nums[left];
}
};


