- 链接:
https://leetcode.cn/problems/B1IidL/ - 题目:
符合下列属性的数组 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 ,即山峰顶部。
ps:题目数据保证 arr 是一个山脉数组.
示例:
输入:arr = [1,3,5,4,2]
输出:2
- 思路:
- 枚举。因为数组一定是山脉数组,所以当
arr[i]>arr[i+1]
时,i就是山峰顶部。通过遍历数组,即可知道。 - 二分查找。因为山脉数组的山峰是最大的,山峰的两边都是有序数组,可以通过二分来进行查找。
- 枚举。因为数组一定是山脉数组,所以当
- 代码:
class Solution {
public:
int peakIndexInMountainArray(vector<int>& arr) {
for(int i=0;i<arr.size()-1;i++){
if(arr[i]>arr[i+1])
return i;
}
return -1;
//第二种
int low=1,high=arr.size()-1,ans=0,mid;
while(low<=high){
mid=(low+high)/2;
if(arr[mid]>arr[mid+1]){
ans=mid;
high=mid-1;
}else
{
low=mid+1;
}
}
return ans;
}
};