一个数组保证是峰值数组(存在一个值大于左边和右边部分数组),找出峰值的index。
要求时间复杂度在O(logn)。
思路:
时间复杂度为O(logn), 可以想到用binary search.
其实用O(n)的找最大值也能通过。
public int peakIndexInMountainArray(int[] arr) {
int res = 0;
int max = 0;
for(int i = 0; i < arr.length; i++) {
if(arr[i] > max) {
max = arr[i];
res = i;
}
}
return res;
}
下面来说说binary search.
一般binary search要求数组升序排列,找某个特定元素,
这里峰值的前半段是升序排列,后半段是降序排列。
要找的是前半段的最大值,后半段的最小值。
只需让arr[mid]和它前后元素比较,
< 前一元素,说明峰值在左边,right = mid,
>
>
> 前一元素说明峰值在右边,left = mid+1(注意边界)。
public int peakIndexInMountainArray(int[] arr) {
int left = 0;
int right = arr.length - 1;
while(left < right) {
int mid = left + (right-left)/2;
if(arr[mid] > arr[mid+1]) right = mid;
else left = mid+1;
}
return left;
}