class Solution {
public int peakIndexInMountainArray(int[] nums) {
//首先把山峰数组中的数分为三种,第一种位于山峰之前,它总是比它的前一个数要大,第二种就是位于山峰之后的数它总是比它前面的数要小,而第三种就是我们所要寻找的山峰它比它左右两边的数都要大
//通过以上的特点我们采取二分策略来寻找山峰
//首先需要确定寻找的开始课结束位置left和right,由于第一个数字和最后一个数字不可能是结果所以直接掠过,掠过着两个数还有一个好处就是我们比较前一个元素时不需要考虑边界条件
int left = 1;
int right = nums.length - 2;
//接着开始真正的二分策略,注意left == right的时候任然是一个有效判断位置需要接着循环
while(left <= right){
int mid = (left + right) /2;
//如果找到山峰直接返回
if(nums[mid] > nums[mid - 1] && nums[mid] > nums[mid + 1]){
return mid;
}
//如果找不到那该元素一定就是山峰左右的元素分别判断
if(nums[mid] < nums[mid - 1]){
right = mid - 1;
}else{
left = mid + 1;
}
}
//如果循环退出说明无法找到合适的山峰
return -1;
}
}
03-02
188