class Solution:
def maxTurbulenceSize(self, arr: List[int]) -> int:
#动态规划
#以arr[i]结尾,且arr[i]>arr[i-1]
increase=[0]*len(arr)
#以arr[i]结尾,且arr[i]<arr[i-1]
decrease=[0]*len(arr)
#初始化的长度都是1
increase[0],decrease[0] = 1,1
res = 1
for i in range(1,len(arr)):
if arr[i]>arr[i-1]:
#如果当前元素大于上一个元素,那就让下降流长度加1
increase[i] = decrease[i-1]+1
#并且在更新下降流的长度为1
decrease[i]=1
elif arr[i]<arr[i-1]:
#如果当前元素小于上一个元素,那就让上升流长度加1
decrease[i] = increase[i-1]+1
#并且在更新上升流的长度为1
increase[i]=1
else:
#如果两个元素相等,那就重组上升和下降流为1
decrease[i]=1
increase[i]=1
#更新res
res = max(res,max(decrease[i],increase[i]))
return res
#动态规划进行状态压缩
increase,decrease = 1,1
res = 1
for i in range(1,len(arr)):
if arr[i]>arr[i-1]:
increase = decrease+1
decrease=1
elif arr[i]<arr[i-1]:
decrease = increase+1
increase=1
else:
increase=1
decrease=1
res = max(res,max(increase,decrease))
return res
- 根据题目的要求其实就是一个摆动数列,增减增减........;一直向这这样交替进行
- 其实一般情况下求最大或者最小的的问题都需要用动态规划区解决
- 因为存在上升和下降两个方面,因此可以进行分类讨论
-
生命上升和下降两个数组
-
如果当前元素大于上一个元素,那就让下降流长度加1,并且更新下降流为1
-
如果当前元素小于上一个元素,那就让上升流长度加1,并且更新上升流为1
-
-
更新最大端流子数组的长度
-
然后在进行优化,不需要声明数组,只需要记录上一个变化量即可
通过这个题目,做动态规划的题目一般都是需要先将大的问题转化为子问题,然后在构建出动态转移方程,然后更新变化量,最后在进行状态压缩,降低空间复杂度。