log n 的时间复杂度,就需要从中间开始找,定义三个变量 start end mid。
- 找到中间位置,有以下几种情况:
1.1 如果大于左边的,也大于右边的,那么这里就是山峰了,直接返回。
1.2 如果小于右边的,那么山峰在右边。(start = mid+1)
1.3 如果小于左边的,那么山峰在左边。(end = mid-1) - 二分循环的结束条件是 start<end。因为他俩相等的时候,就是峰顶,我们可以直接退出并返回。
- 在进行mid赋值后还要考虑mid是否等于0,因为判断语句有 mid-1 的取值,会越界。
- 如果等于0,我们就+1进行规避。(只有start=0,end=1的时候才会有0的情况)
// O(log n)
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int start = 0;
int end = arr.length-1;
int mid = start + ((end-start)>>1);
while (start<end){
if (arr[mid]>=arr[mid-1]){
if (arr[mid]>=arr[mid+1]) {
return mid;
}else if (arr[mid]<=arr[mid+1]){
start = mid+1;
}
}else if (arr[mid]<=arr[mid-1]){
end = mid-1;
}
mid = start + ((end-start)>>1);
if(mid == 0){
mid++;
}
}
return start;
}
}
O(n) 的时间复杂度。找第一个山峰下降的位置,没有下降的位置就说明最后一个就是峰顶。
// O(n)
public int peakIndexInMountainArray(int[] arr) {
int index = 0;
for (; index < arr.length - 1; index++) {
if (arr[index] > arr[index + 1]) {
break;
}
}
return index;
}