[分析] 暴力法,按序扫描数组,找到peak element。提示说复杂度可以是logN级别的,那就要二分查找了,如何进行二分呢?考察nums[mid]和其左右相邻元素:若nums[mid] < nums[mid + 1], 则右侧必存在一个局部最大值,简略证明:若右侧一直是升序,则最后一个元素是peak element, 否则,第一次升序的波峰处是一个peak element。同理,若num[mid] < nums[mid - 1], 则左侧必存在一个局部最大值。若前面两种情况都不成立,则mid处就是一个局部最大值。
public class Solution {
public int findPeakElement1(int[] nums) {
if (nums == null || nums.length == 0)
return -1;
if (nums.length == 1)
return 0;
int N = nums.length;
for (int i = 1; i < N - 1; i++) {
if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1])
return i;
}
if (nums[0] > nums[1])
return 0;
else if (nums[N - 1] > nums[N - 2])
return N - 1;
else
return -1;
}
public int findPeakElement(int[] nums) {
if (nums == null || nums.length == 0)
return -1;
if (nums.length == 1 || nums[0] > nums[1])
return 0;
int N = nums.length;
int left = 0, right = N - 1;
while (right >= left) {
if (left == right)
return left;
int mid = left + (right - left) / 2;
if (nums[mid] < nums[mid + 1])
left = mid + 1;
else if (nums[mid] < nums[mid - 1])
right = mid - 1;
else
return mid;
}
return -1;
}
}