题目
方法一
使用线性遍历实现
分析
代码实现
/**
*在数组i的某个位置i 开始,从 0 到 i 都是递增的,从 i +1 都是递减的,请你找到这个最高点
* 普通方法解决
* @param arr 数组
* @return 数组顶峰索引
*/
public int peakIndexInMountainArray(int [] arr){
int len = arr.length;
// todo 不太懂
int ans = 1;
for (int i = 1; i < len-1; i++) {
if (arr[i] > arr[i + 1]){
ans = i;
break;
}
}
return ans;
}
方法二
使用二分查找实现
分析
代码实现
public int peakIndexInMountainArrayByFind(int [] arr){
// 因为最少有三个值才能有顶峰的说法
if (arr.length == 3){
return 1;
}
int left = 1;
int right = arr.length -2;
while (left < right){
int mid = left + ((right - left) >>1);
// todo 理解
// 中间值 大于左边的值 而 又大于右边的值,说明中间值是最大的,也就是顶峰,即找到了该值,将其返回
if (arr[mid] > arr[mid-1] &&arr[mid] > arr[mid+1]){
return mid;
}
// 中间值 大于 前一个值小于后一个值,说明是单调递增的,左边部分可以忽略
if (arr[mid] < arr[mid+1]&& arr[mid] > arr[mid-1]){
left = mid +1;
}
// 中间值大于后一个值而小于前一个值,说明是单调递减的,右边部分可以忽略
if (arr[mid] > arr[mid+1] && arr[mid] < arr[mid-1]){
right = mid - 1;
}
}
return left;
}