力扣 845. 数组中的最长山脉
把符合下列属性的数组 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
,返回最长山脉子数组的长度。如果不存在山脉子数组,返回 0
。
示例 1:
输入:arr = [2,1,4,7,3,2,5]
输出:5
解释:最长的山脉子数组是 [1,4,7,3,2],长度为 5。
示例 2:
输入:arr = [2,2,2]
输出:0
解释:不存在山脉子数组。
提示:
1 <= arr.length <= 104
0 <= arr[i] <= 104
题解
遍历元素,轮流做山峰,每个山峰确定后,分布向左、右去寻找长度,为了减少搜索次数,
仅当当前山峰满足基本条件arr[i]>arr[i-1]&&arr[i]>arr[i+1]
时才使用两个指针l r
向左、右搜索,
每个山峰搜索后记录当前长度cnt
,比较并更新最大值res
;
- 往左:当
arr[l+1]>arr[l]
,继续往左走,使用while
循环; - 往右:当
arr[r]<arr[r-1]
,继续往右;
搜索中,移动指针时将cnt++
查看代码
class Solution {
public:
int longestMountain(vector<int>& arr) {
int res=0;
for(int i=1;i<arr.size()-1;i++){
if(arr[i]>arr[i-1]&&arr[i]>arr[i+1]){
int l=i-2,r=i+2;
int cnt=3;//至少有三个
while(l>=0&&arr[l+1]>arr[l]){
cnt++;
l--;
}
while(r<arr.size()&&arr[r]<arr[r-1]){
cnt++;
r++;
}
if(cnt>res)
res=cnt;
}
}
return res;
}
};