数组中的最长山脉
我们把数组 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
class Solution { public: int longestMountain(vector<int>& A) { //可以考虑使用动态规划来解决该问题 int n = A.size(); if(!n){ return 0; } //分别枚举两个山脚 //对于左侧的山脚,从左到右依次递增,而对于右侧的山脚从左到右依次递减 //对于其中的一个点,如果左侧山脚和右侧山脚所记录的数均大于1,说明该点即为山顶,同时更新最大长度 vector<int> left(n,0); for(int i =1;i<n;++i){ left[i] = (A[i-1] < A[i]? left[i-1]+1:0); } vector<int> right(n,0); for(int i=n-2;i>=0;--i){ right[i] = (A[i+1] < A[i]? right[i+1]+1:0); } int ans=0; for(int i=0;i<n;++i){ if(left[i]>0 && right[i]>0){ ans = max(ans,left[i]+right[i]+1); } } return ans; } };
注意:考虑采用两个数组分析的动态规划问题

浙公网安备 33010602011771号