题目大意:在给出的数组中找出峰值的索引,假设nums[-1]=nums[n]=-∞,如果有多个返回任意一个即可,要求时间复杂度O(logn),。
分析:二分查找。时间复杂度O(logn)自然联想二分查找。利用好题里的-∞条件来不断缩小搜索空间:拿到mid,判断nums[mid]和右侧数据的大小关系,如果降序,说明峰值在[left,mid];如果升序,说明峰值在[mid+1,right]。
代码:
方法一:线性查找。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
for (int i = 0;i < nums.size() - 1;i++) {
if (nums[i] > nums[i + 1]) return i;
}
return nums.size() - 1;
}
};
方法二:二分查找。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] > nums[mid + 1]) {
right = mid;
} else {
left = mid + 1;
}
}
return right;
}
};