二分查找实战:旋转数组最小值与缺失数字求解
153. 寻找旋转排序数组中的最小值
题目来源 力扣 153 题:寻找旋转排序数组中的最小值
题目描述 假设按照升序排序的数组在预先未知的某个点上进行了旋转。例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。请找出其中最小的元素。你可以假设数组中不存在重复元素。
示例

解题思路:二分查找 这道题的关键在于识别'旋转点'。虽然数组整体不是完全有序的,但它由两个有序子数组组成。 观察图像可以发现,【A,B】区间内的点都是严格大于 D 点的值,而 C 点的值是严格小于 D 点的值。这里的 D 点通常指代数组的最后一个元素。当【C,D】区间只有一个元素时,C 点的值可能等于 D 点的值。
基于这个二段性,我们可以初始化左右指针 left 和 right,通过比较中间值 mid 与参照物(如末尾元素)的大小来收缩区间:
- 若 mid 落在【A,B】区间(即 mid 值 > 末尾值),说明最小值在右侧,更新 left = mid + 1;
- 若 mid 落在【C,D】区间(即 mid 值 <= 末尾值),说明最小值在左侧或就是 mid,更新 right = mid。 当区间长度缩减为 1 时,即为结果。
C++ 实现(以末尾元素为参照)
class Solution {
public:
int findMin(vector<int>& nums) {
// 选择 nums[n - 1] 作为参照物
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;
}
}
return nums[left];
}
};
C++ 实现(以首元素为参照)
class {
:
{
left = ;
right = nums.() - ;
(left < right) {
mid = left + (right - left + ) / ;
(nums[mid] >= nums[]) {
left = mid;
} {
right = mid - ;
}
}
(left == nums.() - )
nums[];
nums[left + ];
}
};





