我们把符合下列属性的数组 A 称作山脉:
A.length >= 3
存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]
给定一个确定为山脉的数组,返回任何满足 A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1] 的 i 的值。
示例 1:
输入:[0,1,0]
输出:1
示例 2:
输入:[0,2,1,0]
输出:1
提示:
3 <= A.length <= 10000
- 0 <= A[i] <= 10^6
- A 是如上定义的山脉
===========================================================================================
看到这题我一懵,这么简单吗?从头到尾遍历一次,判断一下就可以了。做完才发现这个题属于二分查找里的。
那么就使用二分查找来分析一下
(1)先确定中间下标;
(2)中间数据和其左右数据比较:
如果中间数据大于其左侧数据并且大于去右侧数据,则返回中间下标;
如果中间数据只大于其右侧数据,说明中间数据不是顶尖的数,并且中间的数据是在下坡点,需要移动数组右侧的下标;
否则中间的数据就是上坡的点,需要移动数组左侧的下标;
(3)退出条件是左索引大于右索引。
public int peakIndexInMountainArray(int[] arr) {
int left = 0; //左边索引
int right = arr.length-1; //右边索引
while(left<=right){
int mid = (left+right)/2; //得到中间下标
if(arr[mid]>arr[mid+1] && arr[mid]>arr[mid-1]){
return mid; //返回符合的下标
}else if(arr[mid]>arr[mid+1]){
right = mid-1;
}else{
left = mid+1;
}
}
return -1;
}
参考:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/