寻找峰值
题目背景
这道题的输入是一个看似无序的数组。不同于常规的二分查找,它没有全局有序性,但局部存在二段性特征。我们需要找到一个索引,其值大于左右相邻元素。

暴力遍历虽然直观,但时间复杂度为 O(N)。实际上,我们可以利用'峰值'的定义:如果 arr[i] > arr[i + 1],说明左侧存在下降趋势,而左边界可视为负无穷,因此答案一定在左半部分;反之亦然。这构成了二段性。
代码实现
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while(left < right) {
int mid = left + (right - left + 1) / 2;
if(nums[mid] > nums[mid - 1]) left = mid;
else right = mid - 1;
}
return left;
}
};
并非只有有序数组才能用二分,只要存在二段性即可。
寻找旋转排序数组中的最小值
题目背景
给定一个升序数组,经过若干次旋转后,找到最小值。要求时间复杂度为 O(log N)。




