leetcode第162题,二分查找,要求在一个数组中找出尖峰元素,也就是大约相邻位置上数字的元素。
第一反应,线性查找,扫一遍数组,复杂度o(n)。
题目要求是logn的复杂度,就说明肯定是要用二分查找,二分查找的问题是,如何根据中间元素的情况来判断继续搜索哪一边。这里重要的前提条件是边界都是负无穷,只要中间元素大于其后继元素,左半部包含中间元素,肯定存在着一个峰值,因为即使是一路递增到了中间元素,然而头部是负无穷,也保证了第一个元素是峰值。相反的情况也基本类似。
public static int findPeakElement(int[] nums) {
int len = nums.length;
int low = 0;
int high = len-1;
int mid = 0;
while (low < high){
mid = (low+high)/2;
if (nums[mid] < nums[mid+1])
low = mid+1;
else
high = mid;
}
return low;
}