- 山脉数组的峰顶索引
题目:符合下列属性的数组 arr 称为 山脉数组 :
arr.length >= 3
存在 i(0 < i < arr.length - 1)使得:
arr[0] < arr[1] < ... arr[i-1] < arr[i]
arr[i] > arr[i+1] > ... > arr[arr.length - 1]
示例 1:
输入:arr = [0,1,0]
输出:1
提示:
3 <= arr.length <= 10^4
0 <= arr[i] <= 10^6
题目数据保证 arr 是一个山脉数组
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < … arr[i - 1] < arr[i] > arr[i + 1] > … > arr[arr.length - 1] 的下标 i 。
题目就是想让我们找到最大数的下标咱们用二分来解决这个问题。
要用二分但没有明确要查找的数 但是呢这个数组比较特殊 左边递增右边递减,我们可以利用这个特点来进行寻找。
根据题意我们可以得知该数组一定是一个山脉数组也就是说没有重复且一定符和递增递减的特点。所以不用考虑数组值重复或长度为0的情况。
这虽然不是一个连续的递增,但任然可以按照二分思路解决,我们还是来取中间值mid来比较,到比较对象变了,让他跟mid-1和mid+1比较
if [mid-1]<[mid]
left=mid;
if [mid+1]>[mid]
right=mid;
结束条件就是 当 [mid]>[mid-1] && [mid]>[mid-1]
可以认为[left,right]是一个有效区间通过 不断缩小最终找出最大值的下标
class Solution {
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;
}
if(arr[mid]<arr[mid-1]){
right=mid;
}
if(arr[mid]<arr[mid+1]){
left=mid;
}
}
return -1;
}
}