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
解释:不含 “山脉”。

1.经典的dp思路,本质就是2个最长上升序列

2.双指针,对于某个i,往两边扩展

class Solution:
    def longestMountain(self, A: List[int]) -> int:
        dp_left=[1 for _ in range(len(A))]
        dp_right=[1 for _ in range(len(A))]

        for i in range(1,len(A)):
            if A[i]>A[i-1]:
                dp_left[i]=dp_left[i-1]+1
        
        for i in range(len(A)-2,-1,-1):
            if A[i]>A[i+1]:
                dp_right[i]=dp_right[i+1]+1

        res=0
        for i in range(1,len(A)):
            if dp_left[i]>1 and dp_right[i]>1:
                res=max(res,dp_right[i]+dp_left[i]-1)
        
        return res


class Solution:
    def longestMountain(self, A: List[int]) -> int:
        res=0
        for i in range(1,len(A)-1):
            if A[i]>A[i-1] and A[i]>A[i+1]:
                l=r=i 
                while l-1>=0 and A[l]>A[l-1]:l-=1
                while r+1<len(A) and A[r]>A[r+1]:r+=1
                res=max(res,r-l+1)
        return res

 

©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页