一、题目
符合下列属性的数组 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
。
点击查看原题
难度级别:简单
二、思路
1)暴力法
遍历该数组,如果arr[i] - arr[i+``1``]
大于0
,也就是检测到下降的趋势,那么最大值的坐标就为i
2)二分法
要进一步提高查询的效率,可以使用二分法。
设立头尾两个指针s
和e
,让mid=(s + e)/2
,对arr[mid]
和arr[mid-1]
进行判断(目标是找到下降段的第一个下标),看arr[i]
是否处于上升段:
- 属于上升段,
arr[mid]-arr[mid-1]>0
,则s=mid+1
- 属于下降段,
arr[mid]-arr[mid-1]<0
,则e=mid
三、代码
1)暴力法
class Solution {
public int peakIndexInMountainArray(int[] arr) {
for (int i = 0; i < arr.length - 1; i++) {
if (arr[i] - arr[i+1] > 0) {
return i;
}
}
return arr.length - 1;
}
}
2)二分法
class Solution {
public int peakIndexInMountainArray(int[] arr) {
int s = 1, e = arr.length;
while (s < e) {
int mid = (s + e)/2;
int lDiff = arr[mid] - arr[mid - 1];
if (lDiff > 0) {
s = mid + 1;
} else {
e = mid;
}
}
return s - 1;
}
}
时间复杂度为O(logn)
,空间复杂度为O(1)