最长湍流子数组
又是一道数组题,而且是”子“数组类的问题,子数组是连续的这一点务必注意。所以这个题又是一个”维护区间“的问题。
维护区间:
即保持一个满足条件的区间
初始化
left=right=0
然后根据问题的条件移动区间左右边界。
区间退出条件是
while r<n
当区间的长度为1的时候,默认满足条件。更新结果
if end-start==0:
ans = max(ans,start-end+1)
当区间长度为2的时候,只要两个元素不相等,就满足条件。
elif end-start==1:
if A[start]!=A[end]:
ans = max(ans,end-start+1)
如果不满足条件,则应该让区间从start下一个位置开始,并且区间长度变为1
else:
start = start+1
end = start
当区间长度大于等于2的时候。需要最近的三个元素是之差是否互为相反数,如果满足则移动右边界。如果不是则将区间start改为end-1,区间长度变1
else:
if (A[end] - A[end - 1]) * (A[end - 1] - A[end - 2]) < 0:
ans = max(ans,end-start+1)
else:
start = end-1
end = start
完整代码:
class Solution(object):
def maxTurbulenceSize(self, A):
"""
:type A: List[int]
:rtype: int
"""
ans,start,end = 0,0,0
while end<len(A):
if end-start==0:
ans = max(ans,start-end+1)
elif end-start==1:
if A[start]!=A[end]:
ans = max(ans,end-start+1)
else:
start = start+1
end = start
else:
if (A[end] - A[end - 1]) * (A[end - 1] - A[end - 2]) < 0:
ans = max(ans,end-start+1)
else:
start = end-1
end = start
end+=1
return ans
总结:维护区间的模板写法要熟练,左右边界的更新是个细节,容易出错。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。