题目链接
思路:
注意峰值定义:峰值元素是指其值大于左右相邻值的元素。
即,只要出现一个数大于其左右相邻值的元素,即可返回。
由于num[-1]=num[n]=负无穷,所以在遍历数组之前,可以对数组的开头和结尾进行判断,看是否满足峰值的定义
之后,对数组进行二分查找,寻找符合峰值定义的元素
在二分查找时,中间元素不满足峰值定义时,
1)中间元素小于前一个元素,那么左边部分一定存在峰值元素,去左边查找
2)中间元素大于前一个元素并且小于后一个元素时,那么右边部分一定存在峰值,去右边查找
public int findPeakElement(int[] nums) {
if (nums.length == 1) {
return 0;
}
int left = 0;
int right = nums.length - 1;
// 数组第一个位置是否满足峰值定义
if (nums[left] > nums[left + 1]) {
return left;
}
// 数组最后一个位置是否满足峰值定义
if (nums[right] > nums[right - 1]) {
return right;
}
// 二分查找
while (left < right) {
int mid = (left + right) / 2;
if (nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]) {
return mid;
} else if (nums[mid] < nums[mid - 1]) {
right = mid;
} else {
left = mid + 1;
}
}
return left;
}