当前位置: 首页 > news >正文

每日OJ题_子数组子串dp⑥_力扣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
class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {}
};

解析代码

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

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

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

因此需要两个 dp 表:

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

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

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

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

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

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;}
};
http://www.lryc.cn/news/323272.html

相关文章:

  • 蓝桥练习题总结(一)字母图形、完美的代价、01串、序列求和
  • Android 静默安装二(无障碍服务版)
  • 蓝桥杯 EDA 组 2023模拟+真题原理图解析
  • 聊聊功率器件(氮化镓,碳化硅)
  • 计算地球圆盘负荷产生的位移
  • Harbor介绍
  • 解决jenkins运行磁盘满的问题
  • 使用echart绘制拓扑图,树类型,自定义tooltip和label样式,可收缩
  • 常用的6个的ChatGPT网站,国内可用!
  • Linux课程____Samba文件共享服务
  • Java学习day1
  • ByteTrack多目标跟踪——YOLOX详解
  • Linux 常见驱动框架
  • Oracle函数6—递归查询(start with...connect by、sys_connect_by_path、level)
  • 人机交互三原则,网络7层和对应的设备、公钥私钥
  • vue2源码学习01配置rollup打包环境
  • DP:斐波那契数列模型
  • JavaScript高级(十四)----prmise
  • 28 OpenCV 轮廓周围绘制图形
  • 校企合作,助力人才培养——黄冈师范学院-唯众 “实习实训基地”揭牌仪式顺利举行
  • npm audit fix --force
  • 递增四元组
  • 蓝桥杯每日一题——棋盘
  • QT6实现创建与操作sqlite数据库及读取实例(一)
  • 第十四届蓝桥杯JavaB组省赛真题 - 阶乘求和
  • Java毕业设计 基于springboot医院挂号系统 医院管理系统
  • 【MySQL】基本查询(1)
  • 一文讲清!进销存管理系统如何实现锁库及库存冻结?计算月加权平均成本?
  • 将本地项目上传至码云
  • 虚拟化技术