由于题目假设nums[-1]和nums[n]等于负无穷
如果nums[i]>nums[i+1],即nums[-1]<nums[i]>nums[i+1],那么在[0,i]区间内一定存在峰值
如果nums[i]<nums[i+1],即nums[i]<nums[i+1]>nums[n],那么在[i+1,n-1]区间内一定存在峰值
所以可以使用二分法逐步缩小查找的范围,这也是数组没有整体有序但仍能使用二分法的原因
left == right时查找结束
示例2的查找图示
代码
import org.junit.Test;
public class LookForPeeks {
@Test
public void test() {
int[] arr = new int[]{1,2,1,3,5,6,4};
System.out.println(lookForPeek(arr));
}
public static int lookForPeek(int[] arr) {
int left = 0, right = arr.length - 1;
while (left < right) {
int index = left + (right - left) / 2;
if (arr[index] > arr[index + 1]) {
right = index;//arr[index] > arr[index + 1],index有可能是峰值,所以不加一
} else {
left = index + 1;//arr[index] < arr[index + 1],index+1有可能是峰值,所以加一
}
}
return left;
}
}