不能直接用 std::min_element,因为它盲目遍历整个数组,时间复杂度 O(n),未利用旋转数组由两个升序段构成的局部有序性;应改用二分查找变体,通过比较 nums[mid] 与 nums[right] 判断最小值所在区间,将时间复杂度降至 O(log n)。

为什么不能直接用 std::min_element
旋转排序数组(比如 [4,5,6,7,0,1,2])看似乱,实则由两个升序段拼成。直接遍历找最小值虽可行(O(n)),但浪费了“局部有序”这个关键性质。更糟的是,std::min_element 会扫完整个数组,完全没利用旋转结构——它连哪边该跳过都不知道。
真正该用的是二分查找的变体,时间复杂度压到 O(log n)。核心思路不是找“最小值”,而是找“旋转点”:那个突然变小的位置(比如 7 → 0),它的右边就是最小值。
- 每次比较
nums[mid]和nums[right],而不是和nums[left]—— 后者在[1,3]这类无旋转或单元素时容易误判边界 - 如果
nums[mid] > nums[right],说明最小值一定在右半段(mid还在左升序段里) - 如果
nums[mid] ,最小值在左半段或就是mid(右段是升序,最小值不可能在右段中间) -
nums[mid] == nums[right]是最麻烦的:可能是重复值(如[2,2,2,0,1,2]),此时只能保守地--right缩小范围
int findMin(vector& nums) 的标准写法
以下是最常用、能处理重复值的版本,使用闭区间 [left, right] 模式,逻辑清晰不易越界:
left ,不是 ,避免死循环;退出时 left == right,指向唯一候选
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











