Leetcode刷题详解——最长湍流子数组

1. 题目链接:978. 最长湍流子数组

2. 题目描述:

给定一个整数数组 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 * 104
  • 0 <= arr[i] <= 109

3. 解法(动态规划):

3.1 算法思路:

1. 状态表示:

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

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

2. 状态转移方程:

对于i位置的元素 arr[i],又下面两种情况:

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

请添加图片描述

3. 初始化:

所有的元素单独都能构成一个湍流数组,因此可以将 dp表内所有元素初始化为1

由于用到前面的状态,因此我们循环的时候从第二个位置开始即可

4. 填表顺序:

从左往右,两个表一起填

5. 返回值:

返回两个dp表里面的最大值,我们可以在填表的时候,顺序更新一些最大值

3.2 C++算法代码:

class Solution {
public:
    // 计算数组中最大的湍流子数组的长度
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size(); // 获取数组长度
        vector<int> f(n, 1), g(n, 1); // 初始化两个辅助数组f和g,初始值都为1
        int ret = 1; // 初始化最大湍流子数组长度为1
        for (int i = 1; i < n; i++) {
            // 如果当前元素大于前一个元素,更新f[i]
            if (arr[i - 1] < arr[i]) {
                f[i] = g[i - 1] + 1;
            }
            // 如果当前元素小于前一个元素,更新g[i]
            else if (arr[i - 1] > arr[i]) {
                g[i] = f[i - 1] + 1;
            }
            // 如果当前元素等于前一个元素,重置f[i]和g[i]为1
            ret = max(ret, max(f[i], g[i])); // 更新最大湍流子数组长度
        }
        return ret; // 返回最大湍流子数组长度
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/224613.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

简单易懂:Axios 如何取消请求的两种方法

在前端开发中&#xff0c;网络请求是非常常见的操作。而有时候&#xff0c;我们可能需要在发送请求后取消它&#xff0c;比如用户在请求还未完成时离开了当前页面或者执行了其他操作&#xff0c;本文将介绍如何在使用 Axios 发送请求时取消这些请求。 基本概念 在 Axios 中&am…

WindowsServer服务器系列:定时备份 MySQL

一、编写脚本 echo 取日期、时间变量值 set yy%date:~0,4% set mm%date:~5,2% set dd%date:~8,2% if /i %time:~0,2% lss 10 set hh0%time:~1,1% if /i %time:~0,2% geq 10 set hh%time:~0,2% set mn%time:~3,2% set ss%time:~6,2% set date%yy%%mm%%dd% set time%hh%%mn%%ss…

DAPP开发【10】express.js的使用

Express.js 是一种流行、轻量级的开源 Web 应用程序框架&#xff0c;用于开发基于 Node.js 的服务器端 Web 应用程序。它提供了强大的功能集&#xff0c;适用于 Web 和移动应用程序。Express.js 旨在支持单页、多页和混合式 Web 应用程序的开发。Express.js 提供了广泛的功能&a…

2022年第十一届数学建模国际赛小美赛A题翼龙如何飞行解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 A题 翼龙如何飞行 原题再现&#xff1a; 翼龙是翼龙目中一个已灭绝的飞行爬行动物分支。它们存在于中生代的大部分时期&#xff1a;从三叠纪晚期到白垩纪末期。翼龙是已知最早进化出动力飞行的脊椎动物。它们的翅膀是由皮肤、肌肉和其他组…

python学习之JSON数据处理在Python中的应用:从解析到生成

JSON文件是一种轻量级的数据交换格式&#xff0c;它采用了一种类似于JavaScript语法的结构&#xff0c;可以方便地在不同平台和编程语言之间进行数据交换。在Python中&#xff0c;我们可以使用内置的json模块来读取和写入JSON文件。 下面是一个简单的示例&#xff0c;展示了如…

【基于openGauss5.0.0简单使用DBMind】

基于openGauss5.0.0简单使用DBMind 一、环境说明二、初始化tpch测试数据三、使用DBMind索引推荐功能四、使用DBMind实现SQL优化功能 一、环境说明 虚拟机&#xff1a;virtualbox操作系统&#xff1a;openEuler 20.03 TLS数据库&#xff1a;openGauss-5.0.0DBMind&#xff1a;d…

短剧分销小程序/APP开发:开启短剧收益时代

今年&#xff0c;短剧火爆出圈&#xff0c;市场规模将达至200亿元至300亿元。国内全全平台付费短剧日充值金额为6000万元&#xff0c;短剧作为一种“快餐式”文化迅速爆火。 短剧契合了观众娱乐时间碎片化的发展趋势&#xff0c;相比于传统的电视剧&#xff0c;短剧节奏快、剧…

【链表Linked List】力扣-114 二叉树展开为链表

目录 题目描述 解题过程 官方题解 题目描述 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应…

Android View的 getHeight 和 getMeasuredHeight 的区别

前言 先简单复习一下Android View 的 绘制顺序&#xff1a; 1、onMeasure&#xff08;测量&#xff09;&#xff0c;先根据构造器传进来的LayoutParams&#xff08;布局参数&#xff09;&#xff0c;测量view宽高。 2、onLayout&#xff08;布局&#xff09;&#xff0c;再根…

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…

C#核心笔记——(三)在C#中创建类型

3.1 类 类是最常见的一种引用类型&#xff0c;最简单的类的声明如下&#xff1a; class MyClass{}而复杂的类可能包含如下内容&#xff1a; 1.在class关键字之前&#xff1a;类的特性&#xff08;Attribute&#xff09;和修饰符。非嵌套的类修饰符有&#xff1a; public、int…

【计算机网络笔记】物理层——基带传输基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

kyuubi整合flink yarn session mode

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catlogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中&#xff0c;需要注意对应的版本。 注意以上版本 配置 ky…

互联网Java工程师面试题·Spring Cloud篇

目录 1、什么是 Spring Cloud&#xff1f; 2、使用 Spring Cloud 有什么优势&#xff1f; 3、服务注册和发现是什么意思&#xff1f;Spring Cloud 如何实现&#xff1f; 4、负载平衡的意义什么&#xff1f; 5、什么是 Hystrix&#xff1f;它如何实现容错&#xff1f; 6、什么是…

SpringBoot读取properties文字乱码问题及相关问题

问题&#xff1a;在idea的编辑器中properties文件一般用UTF-8编码&#xff0c;SpringBoot2读取解码方式默认不是UTF-8&#xff0c;当值出现中文时SpringBoot读取时出现了乱码。 解决方式1&#xff1a;在SpringBoot框架层面解决&#xff0c;在配置类注解上添加encoding属性值为…

【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程&#xff0c;如果仿真都没通过&#xff0c;则上板测试必定失败。 FPGA图像处理需要读写大量的图像数据&#xff0c;单看这些图像数据实际是没有规则的&#xff0c;如果直接上板测试&#xff0c;调试起来非常困难&#xff0…

【Vue】Vue Router 在 Vue2 项目中的简单使用案例

前言 Vue Router 是 Vue.js 官方的路由管理器。它可以帮助我们在 Vue2 项目中实现页面之间的切换和导航。以下是在 Vue2 项目中使用 Vue Router 的简单案例。 步骤 安装 Vue Router 首先&#xff0c;我们需要安装 vue-router 包。你可以使用 npm 或 yarn 安装&#xff0c;打开…

C语言实现植物大战僵尸(完整版)

实现这个游戏需要Easy_X 这个在我前面一篇C之番外篇爱心代码有程序教你怎么下载&#xff0c;大家可自行查看 然后就是需要植物大战僵尸的素材和音乐&#xff0c;需要的可以在评论区 首先是main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏…

Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码

一、相关API的handler1、接收HTTP请求的hander2、每一个数据节点(node)执行分片刷新的action是TransportShardFlushAction 二、对indexShard执行刷新请求1、首先获取读锁&#xff0c;再获取刷新锁&#xff0c;如果获取不到根据参数决定是否直接返回还是等待2、在刷新之后transl…

【Azure 架构师学习笔记】- Azure Databricks (2) -集群

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (1) - 环境搭建 前言 在上文中提到了ADB 的其中一个核心就是集群&#xff0c;所以这里专门研究一下ADB 的集群。 ADB 集群 首先了解一下ADB…