021 山脉数组的峰顶索引
题目描述:

1.1 思路一:暴力解法
1.1.1 算法思路
峰顶的特点:比两侧的元素都要大。 因此,我们可以遍历数组内的每一个元素,找到某一个元素比两边的元素大即可。
1.1.2 算法实现
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
int n = arr.size();
// 遍历数组内每一个元素,直到找到峰顶
for (int i = 1; i < n - 1; i++) {
// 峰顶满足的条件
if (arr[i] > arr[i - 1] && arr[i] > arr[i + 1])
return i;
}
// 为了处理 oj 需要控制所有路径都有返回值
return -1;
}
};
时间复杂度:O(n),空间复杂度:O(1)。

1.2 思路二:二分查找
1.2.1 算法思路
1、分析峰顶位置的数据特点,以及山峰两旁的数据的特点:
(1)峰顶数据特点:arr[i] > arr[i - 1] && arr[i] > arr[i + 1];
(2)峰顶左边的数据特点:arr[i] > arr[i - 1] && arr[i] < arr[i + 1],也就是呈现上升趋势;
(3)峰顶右边数据的特点:arr[i] < arr[i - 1] && arr[i] > arr[i + 1],也就是呈现下降趋势。





