我们把数组 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(object):
def longestMountain(self, A):
"""
:type A: List[int]
:rtype: int
"""
if len(A) < 3:
return 0
ret = 0
# 从第一个数开始判断
stack = [0]
# 能找到的最长山脉,当只有01012之类的出现时可以尽早结束循环
max_num = 2 *(max(A)-min(A)) + 1
# 开始循环查找
while stack:
cur = stack.pop()
# 当已经找到最长山脉时直接结束循环
if ret >= len(A) - cur or ret >= max_num: #当前山峰的长度已经比后面可能的长度大
break
# 山脉左右两边元素个数
l_tmp, r_tmp = 0, 0
# 从cur位置开始查找
while cur < len(A) - 1:
if A[cur] < A[cur+1] and r_tmp == 0:
l_tmp += 1
cur += 1
elif A[cur] > A[cur+1] and l_tmp > 0:
r_tmp += 1
cur += 1
else:
break
# 查找完成后判断是不是找到更长的
if r_tmp>0 and l_tmp+r_tmp>=ret:
ret = l_tmp+r_tmp+1
# 当没找到时应该从下一个位置继续寻找
if r_tmp == 0:
cur += 1
# 这里主要是把下一个查找位置压入栈中,注意当找到山脉时只需把当前没构成山脉的位置添加过去即可
if cur < len(A):
stack.append(cur)
return ret
拼多多的最长山谷
A=[1,2,3,2,5,6,5,3,2,3,4,8,1]
def longestMountain(A):
"""
:type A: List[int]
:rtype: int
"""
if len(A) < 3:
return 0
ret = 0
# 从第一个数开始判断
stack = [0]
# 能找到的最长山脉,当只有101012之类的出现时可以尽早结束循环
max_num = 2 *(max(A)-min(A)) + 1
# 开始循环查找
while stack:
cur = stack.pop()
# 当已经找到最长山谷时直接结束循环
if ret >= len(A) - cur or ret >= max_num:
break
# 山谷左右两边元素个数
l_tmp, r_tmp = 0, 0
# 从cur位置开始查找
while cur < len(A) - 1:
if A[cur] > A[cur+1] and r_tmp == 0:
l_tmp += 1
cur += 1
elif A[cur] < A[cur+1] and l_tmp > 0:
r_tmp += 1
cur += 1
else:
break
# 查找完成后判断是不是找到更长的
if r_tmp>0 and l_tmp+r_tmp>=ret:
ret = l_tmp+r_tmp+1
# 当没找到时应该从下一个位置继续寻找
if r_tmp == 0:
cur += 1
# 这里主要是把下一个查找位置压入栈中,注意当找到山脉时只需把当前没构成山脉的位置添加过去即可
if cur < len(A):
stack.append(cur)
return ret
另一种最长山谷的求法
x=[1,2,5,3,2,3,4]
n = len(x)
if n < 3:
print (0)
else:
res = 0
for i in range(1,n-1):
l = i
while l > 0 and x[l-1]>x[l]:
l -= 1
r = i
while r < n-1 and x[r+1]>x[r]:
r += 1
if l < i and r > i:
res = max(res,r-l+1)
print (res if res >= 3 else 0)
输出
xx=input()#输入一行
x=list(map(int,xx.split(' '))) #注意不要多输入了空格