我们把数组 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
**难度**: 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