845.数组中最长的山脉-中等-数组山脉、动态规划
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:
B.length >= 3
- 存在
0 < i < B.length - 1
使得B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1]
(注意:B 可以是 A 的任意子数组,包括整个数组 A。)
给出一个整数数组 A,返回最长 “山脉” 的长度。
如果不含有 “山脉” 则返回 0。
示例 1:
输入:[2,1,4,7,3,2,5]
输出:5
解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
示例 2:
输入:[2,2,2]
输出:0
解释:不含 “山脉”。
提示:
0 <= A.length <= 10000
0 <= A[i] <= 10000
题解
还是一道动态规划的题,解法是通过枚举山脚的方式,记录山脉的左山脚和右山脚。
left[]
存储的是上坡长度right[]
存储下坡长度
(显然当left[i] != 0 && right[i] != 0
的时候i
为山顶,并且可以求出山的长度)
class Solution {
public int longestMountain(int[] A) {
int N = A.length;
int[] left = new int[N];
int[] right = new int[N];
for(int i=1; i<N; i++){
left[i] = A[i] > A[i-1] ? left[i-1]+1 : 0;
}
for(int i=N-2; i>=0; i--){
right[i] = A[i] > A[i+1] ? right[i+1]+1 : 0;
}
int ans = 0;
for(int i=0; i<N;i++){
if( left[i] != 0 && right[i] != 0 ){
ans = Math.max(ans, left[i]+right[i]+1);
}
}
return ans;
}
}