动态规划 —— 子数组系列-最长湍流子数组

news/2024/11/19 7:58:14/

1. 最长湍流子数组

题目链接:

978. 最长湍流子数组 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/longest-turbulent-subarray/description/

 


2. 题目解析

假如有一个数组{a , b , c , d }如果在a这个位置,b比a大,呈上升趋势,c比b小,呈下降趋势,d比c大,呈上升趋势,像这种就是湍流子数组,简单来说就是必须的是上下上下或者下上下上

 

像这种一直上升或者一直下降的长度就是2 

 

如果单单只有一个的话就是1 

 


3. 算法原理 

状态表示:以某一个位置为结尾或者以某一个位置为起点

  

f[i]表示:以i位置为结尾的所有子数组中,最后一个位置呈上升状态下的最长湍流子数组的长度

  

g[i]表示:以i位置为结尾的所有子数组中,最后一个位置呈下降状态下的最长湍流子数组的长度  

2. 状态转移方程

  

f[i]分为三种情况:

  

  

g[i]分为三种情况:

 

3. 初始化 :把dp表填满不越界,让后面的填表可以顺利进行

  

因为根据上面的状态转移方程我们可以看到所有情况里最少也是1,所以我们可以将f表和g表全部初始化为1,那样的话上面的6种情况就只用考虑两种情况

4. 填表顺序 

  

本题的填表顺序是:从左往右,两个表一起填

5. 返回值 :题目要求 + 状态表示     

    

本题的返回值是:两个表里的最大值


4.  代码

动态规划的固定四步骤:1.  创建一个dp表

                                        2. 在填表之前初始化

                                        3. 填表(填表方法:状态转移方程)

                                        4. 确定返回值

class Solution {
public:int maxTurbulenceSize(vector<int>& arr) {int n=arr.size();vector<int>f(n,1),g(n,1);int ret=1;//因为最少也是1for(int i=1;i<n;i++){if(arr[i-1]<arr[i]) f[i]=g[i-1]+1;else if(arr[i-1]>arr[i]) g[i]=f[i-1]+1;ret=max(ret,max(f[i],g[i]));}return ret;}
};

未完待续~


http://www.ppmy.cn/news/1548188.html

相关文章

【汇编语言】数据处理的两个基本问题(二) —— 解密汇编语言:数据长度与寻址方式的综合应用

文章目录 前言1. 指令要处理的数据有多长&#xff1f;1.1 通过寄存器指明数据的尺寸1.1.1 字操作1.1.2 字节操作 1.2 用操作符X ptr指明内存单元的长度1.2.1 访问字单元1.2.2 访问字节单元1.2.3 为什么要用操作符X ptr指明 1.3 其他方法 2. 寻址方式的综合应用2.1 问题背景&…

蓝桥杯每日真题 - 第16天

题目&#xff1a;&#xff08;卡牌&#xff09; 题目描述&#xff08;X届 C&C B组X题&#xff09; 解题思路&#xff1a; 题目分析&#xff1a; 有 n 种卡牌&#xff0c;每种卡牌的现有数量为 a[i]&#xff0c;所需的最大数量为 b[i]&#xff0c;还有 m 张空白卡牌。 每次…

传奇996_21——龙岭事件

游戏事件 点击事件 点击触发npc 倒叙讲解&#xff1a; 提前设下游戏事件add&#xff0c;由点击npc事件EventCfg.onClicknpc调用该游戏事件&#xff0c;搜索EventCfg.onClicknpc即可 GameEvent.add(EventCfg.onClicknpc, function (actor,npcid,npcRet)if npcid ~ 14 and n…

【大数据分析机器学习】分布式机器学习

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈智能大数据分析 ⌋ ⌋ ⌋ 智能大数据分析是指利用先进的技术和算法对大规模数据进行深入分析和挖掘&#xff0c;以提取有价值的信息和洞察。它结合了大数据技术、人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&a…

蓝桥杯每日真题 - 第15天

题目&#xff1a;&#xff08;钟表&#xff09; 题目描述&#xff08;13届 C&C B组B题&#xff09; 解题思路&#xff1a; 理解钟表指针的运动&#xff1a; 秒针每分钟转一圈&#xff0c;即每秒转6度。 分针每小时转一圈&#xff0c;即每分钟转6度。 时针每12小时转一圈…

C++ 模板进阶:探索更强大的编程技巧

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; 如果你对C 模板编程还存在疑惑&#xff0c;欢迎阅读我之前的作品 &#xff1a; &#x1f525;&#x1f525;&#x1f525;C 模板…

C++设计模式:建造者模式(Builder) 房屋建造案例

什么是建造者模式&#xff1f; 建造者模式是一种创建型设计模式&#xff0c;它用于一步步地构建一个复杂对象&#xff0c;同时将对象的构建过程与它的表示分离开。简单来说&#xff1a; 它将复杂对象的“建造步骤”分成多部分&#xff0c;让我们可以灵活地控制这些步骤。通过…

Signoz 和 Jaeger

Signoz 和 Jaeger 是两款流行的分布式追踪系统&#xff0c;它们都旨在帮助开发者和运维人员理解和优化分布式系统的性能。下面是 Signoz 和 Jaeger 的一些主要特性和对比&#xff1a; 1. 项目背景 Jaeger 开源时间&#xff1a;Jaeger 是由 Uber 开源的&#xff0c;最初发布于…