23. 寻找旋转排序数组中的最小值
题目链接
题目描述
已知一个长度为 n 的升序数组,在某个未知的下标 k (0 <= k < n) 处进行了旋转。例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。请找出其中最小的元素。
题目示例

解题思路
这道题的核心在于利用旋转数组的特性进行二分查找。虽然数组整体不是有序的,但它具有'二段性':
- 前半部分(旋转点之前)的元素严格大于后半部分的元素。
- 后半部分(包含旋转点)是递增的。
我们可以比较中间元素 mid 与右端点 right 的值来缩小搜索范围:
- 如果
nums[mid] > nums[right],说明mid位于前半段(较大的那段),最小值一定在mid右侧,即区间[mid + 1, right]。 - 如果
nums[mid] <= nums[right],说明mid位于后半段(较小的那段),或者mid就是最小值本身,此时最小值在[left, 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 + ;
} {
right = mid;
}
}
nums[left];
}
};





