February——978. 最长湍流子数组

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

  • 更新最大端流子数组的长度

  • 然后在进行优化,不需要声明数组,只需要记录上一个变化量即可

通过这个题目,做动态规划的题目一般都是需要先将大的问题转化为子问题,然后在构建出动态转移方程,然后更新变化量,最后在进行状态压缩,降低空间复杂度。

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/113766733