数组中的最长山脉

我们把数组 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;
    }
};

注意:考虑采用两个数组分析的动态规划问题

posted @ 2020-10-25 19:01  zmachine  阅读(253)  评论(0)    收藏  举报