class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型
*/
int findPeakElement(vector<int>& nums) {
// write code here
int left = 0;
int right = nums.size() - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 如果中间元素大于右侧元素,峰值在左侧(包括mid)(mid高,峰值在包括高的一侧)
if (nums[mid] > nums[mid + 1]) {
right = mid;
}
// 如果中间元素小于右侧元素,峰值在右侧(mid低,故不包括mid)
else {
left = mid + 1;
}
}
// 当left == right时,找到峰值
return left;
}
};
这个问题可以使用二分查找在 O(logN) 时间内解决。关键观察点是:由于数组两端的边界被视为负无穷,且相邻元素不相等,所以数组中至少存在一个峰值。
方法思路
问题分析:我们需要找到一个严格大于其左右相邻元素的峰值。由于数组边界被视为负无穷,且相邻元素不相等,所以峰值一定存在。
算法选择:使用二分查找。比较中间元素与其右侧元素:
如果中间元素大于右侧元素,说明峰值在左侧(包括中间元素)
如果中间元素小于右侧元素,说明峰值在右侧
复杂度分析:时间复杂度为 O(logN),空间复杂度为 O(1)。