算法日常・每日刷题--<动态规划>24

978. 最长湍流子数组 - 力扣(LeetCode)

题目描述

当一个子数组满足下面条件之一时,我们称它为湍流子数组:

  • 对于索引 i,当 i 是奇数:arr[i] > arr[i-1];当 i 是偶数:arr[i] < arr[i-1] 或者
  • 对于索引 i,当 i 是奇数:arr[i] < arr[i-1];当 i 是偶数:arr[i] > arr[i-1]

简单一句话:相邻元素大小交替,像波浪一样起伏,不能连续上升,也不能连续下降 。 给定数组 arr,返回最长湍流子数组的长度。

解法

DP 数组定义

  • fx[i]:以 arr[i] 结尾,最后一步是 arr i < arr i-1(下降) 的湍流子数组最大长度
  • gx[i]:以 arr[i] 结尾,最后一步是 arr i > arr i-1(上升) 的湍流子数组最大长度

湍流的特点:上升后面必须接下降,下降后面必须接上升,交替出现。

状态转移

  1. arr[i] > arr[i-1](当前上升)
    • 当前上升,上一步必须是下降才能构成湍流
    • gx[i] = fx[i-1] + 1
    • fx[i] = 1(不能以下降结尾,重置为 1,代表只有自己)
  2. arr[i] < arr[i-1](当前下降)
    • 当前下降,上一步必须是上升才能构成湍流
    • fx[i] = gx[i-1] + 1
    • gx[i] = 1
  3. arr[i] == arr[i-1](相等,湍流断裂)
    • 上升、下降都无法延续,fx[i] = 1,gx[i] =1,子数组只能包含自身
cpp 复制代码
class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n=arr.size();
        vector<int>fx(n,0);
        vector<int>gx(n,0);
        if(n==1)return 1;
        if(n==2&&arr[0]!=arr[1])return 2;
        if(n==2&&arr[0]==arr[1])return 1;
        fx[0]=1;fx[1]=arr[0]>arr[1]?2:1;
        gx[0]=1;gx[1]=arr[0]<arr[1]?2:1;
        int ret=1;
        for(int i=2;i<n;i++)
        {
            if(arr[i]>arr[i-1])
            {
                fx[i]=1;
                gx[i]=fx[i-1]+1;
            }
            else if(arr[i]<arr[i-1])
            {
                gx[i]=1;
                fx[i]=gx[i-1]+1;
            }
            else{
                gx[i]=fx[i]=1;
            }
            int maxsize=max(fx[i],gx[i]);
            ret=ret>maxsize?ret:maxsize;
        }
        return ret;
    }
};
相关推荐
爱读书的小胖1 小时前
Codewars Sum of a Sequence Hard Core Version C 解题分析
c语言·数据结构·算法
Shaoshing1 小时前
二分模板(左右查询)
java·算法·二分
蒲公英eric1 小时前
线性回归与正则化:从最小二乘到岭回归、LASSO
人工智能·算法·数学建模·线性回归·岭回归·最小二乘·lasso
碧海银沙音频科技研究院5 小时前
炬芯ATS3089X手表的HFP通话不自动路由到设备BT的问题解决
网络·人工智能·嵌入式硬件·算法
专注仿真10 小时前
引擎扩展性与集成设计深度剖析:从 14 个扩展点到 DIS→HLA 演进之路
开发语言·算法·仿真引擎·推演引擎
码爸11 小时前
支持向量机介绍与示例
算法·机器学习·支持向量机
怕浪猫11 小时前
2028编程圈很火的10个Skills
算法·面试·github
Nil20815 小时前
leetcode 198打家劫舍
算法·leetcode·职场和发展