寻找峰值
要求
思路
题目要求时间复杂度是O(logN)。
二分查找,判断中间值是否大于左右两边的值,如果均大于,返回中间索引;如果中间值小于左边的值,那么,左边肯定有峰值(坡),因为边界是负无穷大,从中间到边界,不可能一直增大;如果中间值小于右边的值一样。
代码
public int findPeakElement(int[] nums) {
//如果没有元素
if(nums == null || nums.length == 0) {
return -1;
}
//如果只有一个元素或者第一个元素大于第二个元素
if(nums.length == 1 || nums[0] > nums[1]) {
return 0;
}
//如果最后一个元素大于倒数第二个元素
if(nums[nums.length - 1] > nums[nums.length - 2]) {
return (nums.length - 1);
}
//左指针
int left = 0;
//右指针
int right = nums.length - 1;
while(left <= right) {
//中间指针
int mid = left + (right - left) / 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;
}
}
//没有峰值
return -1;
}