Leetcode 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. 0 <= A.length <= 10000
  2. 0 <= A[i] <= 10000

**难度**: Medium

**标签**: 双指针、


# -*- coding: utf-8 -*-
# @Author  : LG

"""
执行用时:64 ms, 在所有 Python3 提交中击败了97.12% 的用户
内存消耗:14.1 MB, 在所有 Python3 提交中击败了78.97% 的用户

解题思路:
    模拟提议,记录当前起伏状态,分析是否是山脉
    具体实现见代码注释
"""
class Solution:
    def longestMountain(self, A: List[int]) -> int:
        s, p, l = 0, 0, 0   # 起始点,p指针,记录当前最长山脉长度
        up, down = False, False # 记录当前起伏状态
        while p < len(A)-1:
            if A[p] > A[p+1]: # 当前下降
                if up:  # 如果之前存在上升状态,则存在山脉,激活山脉的下降状态
                    down = True
                else:
                    s = p+1 # 否则,之前不存在山脉,将挪动起始点
            elif A[p] < A[p+1]:   # 当前上升
                if up == True and down == True: # 如果上升和下降状态激活, 则存在山脉,且山脉结束
                    l = max(l, p+1-s)   # 更新山脉长度
                    s = p   # 挪动起始点
                    down = False    # 重置起伏状态
                up = True
            else:   # 平地
                if up == True and down == True: # 如果之前存在山脉,则更新l
                    l = max(l, p+1 - s)
                up = False  # 重置起伏状态
                down = False
                s = p+1 # 挪动起始点
            p += 1
        if up == True and down == True: # 如果存在山脉,则更新l
            l = max(l, p+1 - s )
        return l