题目描述:
标签:二分查找
符合下列属性的数组 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]
给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。
代码:
思路分析:二分查找
这里主要想记录一下“循环不变量”的用法:
循环不变量的规则:要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作。
一、二分法第一种写法:
左闭右闭区间[left,right] ==》 ①while(left <= right)因为left==right是有意义的,所以要使用“<=” ; ②right=mid-1,因为arr[mid]一定不是目标值
二、二分法第二种写法:
左闭右开区间[left,right) ==》 ①while(left < right)因为left==right是没有意义的,所以要使用“<” ; ②right=mid,因为区间是左闭右开的
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int len = arr.length;
int left = 1;
int right = len - 2;
int ans = 0;
while(left <= right){
int mid = (left + right) / 2;
if(arr[mid] > arr[mid+1]){
ans = mid;
right = mid - 1;
}else{
left = mid + 1;
}
}
return ans;
}
}