
23. 寻找旋转排序数组中的最小值
题目描述
给定一个升序排列的数组,该数组在某个未知的枢轴点进行了旋转。例如 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2]。请找出其中的最小元素。
题目示例
输入:[3,4,5,1,2]
输出:1
输入:[4,5,6,7,0,1,2]
输出:0
解法(二分查找)
思路解析
这道题的核心在于利用旋转数组的特性进行二分。观察图像可以发现,数组被分成了两个有序区间:
- 前半部分
[A, B]的元素严格大于后半部分[C, D]的元素。 - 最小值点
C是第一个小于等于右端点D的元素。
二分的本质是找到一个判断标准,将查找区间一分为二。我们可以以右端点 nums[right] 为参照物:
- 如果
mid位置的值大于右端点值,说明mid落在左半段递增区间,最小值一定在mid右侧,即[mid + 1, right]。 - 如果
mid位置的值小于等于右端点值,说明mid落在右半段或就是最小值点,最小值在mid左侧或即为mid,即[left, mid]。
当左右指针相遇时,区间长度为 1,此时的值即为最小值。
代码实现(以 nums[n - 1] 为参照物)
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;
(nums[mid] > nums[nums.() - ]) {
left = mid + ;
} {
right = mid;
}
}
nums[left];
}
};




