每日OJ题_子数组子串dp⑥_力扣978. 最长湍流子数组

目录

[力扣978. 最长湍流子数组](#力扣978. 最长湍流子数组)

解析代码


力扣978. 最长湍流子数组

978. 最长湍流子数组

难度 中等

给定一个整数数组 arr ,返回 arr最大湍流子数组的长度

如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组

更正式地来说,当 arr 的子数组 A[i], A[i+1], ..., A[j] 满足仅满足下列条件时,我们称其为湍流子数组

  • i <= k < j
    • k 为奇数时, A[k] > A[k+1],且
    • k 为偶数时,A[k] < A[k+1]
  • i <= k < j
    • k 为偶数时,A[k] > A[k+1] ,且
    • k 为奇数时, A[k] < A[k+1]

示例 1:

复制代码
输入:arr = [9,4,2,10,7,8,8,1,9]
输出:5
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]

示例 2:

复制代码
输入:arr = [4,8,12,16]
输出:2

示例 3:

复制代码
输入:arr = [100]
输出:1

提示:

  • 1 <= arr.length <= 4 * 10^4
  • 0 <= arr[i] <= 10^9
cpp 复制代码
class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {

    }
};

解析代码

题意的湍流数组就是一上一下的意思,只有一个元素时长度为1。

先尝试定义状态表示为:dpi 表示以 i 位置为结尾的最长湍流数组的长度

但是,问题来了,如果状态表示这样定义的话,以 i 位置为结尾的最长湍流数组的长度我们没法从之前的状态推导出来。因为我们不知道前一个最长湍流数组的结尾处是递增的,还是递减的。因此,我们需要状态表示能表示多一点的信息:要能让我们知道这一个最长湍流数组的结尾是递增 的还是递减的。

因此需要两个 dp 表:

  • fi 表示:以i位置元素为结尾的所有子数组中,最后呈现上升状态 下的最**⻓** 湍流数组的**⻓**度。
  • gi 表示:以i位置元素为结尾的所有子数组中,最后呈现下降状态 下的最**⻓** 湍流数组的**⻓**。

状态转移方程: 对于 i 位置的元素 arri ,有下面两种情况:

  • arri > arri - 1 :如果 i 位置的元素比 i - 1 位置的元素大,说明接下来 应该去找 i -1 位置结尾,并且 i - 1 位置元素比前⼀个元素小的序列,那就是 gi - 1 。更新 fi 位置的值:fi = gi - 1 + 1 ;
  • arri < arri - 1 :如果 i 位置的元素比 i - 1 位置的元素小,说明接下来 应该去找 i - 1 位置结尾,并且 i - 1 位置元素比前⼀个元素大的序列,那就是 fi - 1 。更新 gi 位置的值:gi = fi - 1 + 1;
  • arri == arri - 1 :不构成湍流数组。

初始化: 所有的元素单独都能构成一个湍流数组,因此可以将 dp 表内所有元素初始化为 1。 由于用到前面的状态,因此循环的时候从第二个位置开始。

从左往右,两个表一起填,最后返回两个dp表中的最大值即可。

cpp 复制代码
class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size(), ret = 1;
        vector<int> f(n, 1), g(n, 1);
        // 以i位置元素为结尾的所有子数组中,呈现上升/下降状态下的最⻓湍流数组的⻓度
        for(int i = 1; i < n; ++i)
        {
            if(arr[i-1] > arr[i]) // 下降的
            {
                g[i] = f[i-1] + 1; 
            }
            else if(arr[i-1] < arr[i]) // 上升的
            {
                f[i] = g[i-1] + 1; 
            }
            ret = max(ret, max(f[i], g[i]));
        }
        return ret;
    }
};
相关推荐
hqyjzsb3 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye3 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术3 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
sanjiaomao3334 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试
Keven_114 小时前
算法札记:ACM适用的很骚的C++语法(持续更新)
开发语言·c++
乐迪信息4 小时前
如何通过AI防爆摄像机精准判断船舶超速?
大数据·人工智能·算法·安全·目标跟踪
mengzhi啊4 小时前
QPluginLoader 动态 DLL 插件版,支持插件之间通信,广播。请求和应答
c++·qt
大圣编蚕5 小时前
Java ByteArrayInputStream 详解:从入门到实战
java·开发语言·算法
小玮看世界6 小时前
[Python]OD算法在OD实际运用转化参考清单
开发语言·python·算法
黎阳之光6 小时前
数字孪生赋能全域水网,实现水资源管控与节水降碳双向提升
人工智能·物联网·算法·安全·数字孪生