这道题是说,给一个数组,这个数组里有好几个局部最大值,找出一个局部最大值返回其下标。数组两边都认为是负无穷。
首先想到了暴力的方法:
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int i = 1;
for(; i < nums.size(); ++i)
{
if(nums[i] < nums[i-1]) break;
}
return i-1;
}
};
实际上这个题考查的是二分搜索。首先找到左右的中点mid位置,如果nums[mid]和nums[mid+1]构成的是一个上坡,那么说明峰值在mid的右边;如果nums[mid]和nums[mid+1]构成的是一个下坡,说明峰值在mid的左边。
class Solution {
public:
int findPeakElement(vector<int>& nums) {
int left = 0, right = nums.size()-1;
while(left < right)
{
int mid = left + (right - left) / 2;
if(nums[mid] < nums[mid + 1])
left = mid + 1;
else
right = mid;
}
return left;
}
};