「动态规划」如何求最长湍流子数组的长度?

78. 最长湍流子数组icon-default.png?t=N7T8https://leetcode.cn/problems/longest-turbulent-subarray/description/

给定一个整数数组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。


我们用动态规划的思想来解决这个问题。

确定状态表示:根据经验和题目要求,我们用dp[i]表示:以i位置为结尾的所有子数组中,最长湍流子数组的长度。但是这样的状态表示推不出状态转移方程,所以我们需要更细的划分:

  • 用f[i]表示:以i位置为结尾的所有最后呈现上升趋势的子数组中,最长湍流子数组的长度
  • 用g[i]表示:以i位置为结尾的所有最后呈现下降趋势的子数组中,最长湍流子数组的长度

推导状态转移方程:考虑最近的一步。以i位置为结尾的湍流子数组和以i - 1位置为结尾的湍流子数组有什么关系呢?以f[i]为例,分类讨论:

  • 如果arr[i - 1] >= arr[i],那么以i位置为结尾的最后呈现上升趋势的最长湍流子数组就是arr[i]本身,即f[i] = 1。
  • 如果arr[i - 1] < arr[i],那么以i位置为结尾的最后呈现上升趋势的最长湍流子数组,就应该是「以i - 1位置为结尾的最后呈现下降趋势的最长湍流子数组」的末尾添加arr[i]之后,形成的湍流子数组,即f[i] = g[i - 1] + 1。

综上所述:f[i] = arr[i - 1] >= arr[i] ? 1 : g[i - 1] + 1。同理,g[i] = arr[i - 1] <= arr[i] ? 1 : f[i - 1] + 1。换句话说,f[i]和g[i]默认是1,如果arr[i - 1] < arr[i],那么f[i] = g[i - 1] + 1;如果arr[i - 1] > arr[i],那么g[i] = f[i - 1] + 1

初始化:根据状态转移方程,我们需要初始化f[0]和g[0]的值,防止越界。显然f[0] = g[0] = 1

填表顺序:根据状态转移方程,显然应从左往右,同时填两个表

返回值:根据状态表示,由于我们不确定最长湍流子数组的结束位置,所以应返回f表和g表中,所有元素的最大值

细节问题:显然f表和g表的规模和arr相同,均为1 x n

时间复杂度:O(N),空间复杂度:O(N)。

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();

        // 创建dp表
        vector<int> f(n, 1);
        auto g = f;

        // 填表
        for (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;
            }
        }

        // 返回结果
        return max(*max_element(f.begin(), f.end()),
                   *max_element(g.begin(), g.end()));
    }
};

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

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

相关文章

算法期末整理

目录 一 算法概述 二 递归与分治策略 三 动态规划 四 贪心算法 五 回溯法 六 分支限界法 七 随机化算法 八 线性规划与网络流 一 算法概述 算法的概念 通俗地讲&#xff0c;算法是指解决问题的一种方法或一个过程。更严格地讲&#xff0c;算法是由若干条指令组成的有穷…

设计模式——职责链模式

职责链模式(Chain of Responsibility) 使多个对象都有机会处理请求&#xff0c;从而避免请求的发送者和接收者之间的耦合关系。将这个对象连接成一条链&#xff0c;并沿着这条链传递请求&#xff0c;直到有一个对象处理它为止。   发出请求的客户端并不知道职责链中哪一个对象…

python watchdog 配置文件热更新

目录 一、Watchdog示例 二、aiohttp服务配置热更新 在同事的golang代码中学习到了config.json热更新的功能&#xff0c;这里自己也学习了一下python写web服务的时候怎么来实现配置的热更新。主要是利用Watchdog这个第三方python库&#xff0c;来监控文件系统的改变&#xff0…

实战电商大数据项目搭建||电商大数据采集||电商API接口

我会提供给你大概1亿条真实的互联网用户上网数据&#xff0c;至于来源&#xff0c;我先不告诉你&#xff0c;绝对是你在网络上无法找到的宝贵数据源。 此外&#xff0c;还会给你提供一个基于当前数据特点而设计的大数据处理方案。 当然&#xff0c;为了防止用户的隐私部分被泄露…

每日优秀影视分享❗❗

一、热门电影推荐 《头脑特工队 2》&#xff1a;皮克斯再次为观众带来了这部经典动画的续集。 影片讲述了刚步入青春期的小女孩莱莉脑海中的复杂情绪进行的一场奇妙冒险。 这部电影不仅延续了前作的优秀品质&#xff0c;更在情感深度和视觉呈现上有了进一步的提升。 《艾尔登…

同时使用接口文档swagger和knife4j

项目场景&#xff1a; springboot项目中同时使用接口文档swagger和knife4j 问题描述 在实体类中设置了字段必填的属性&#xff0c;在访问接口文档时出现异常 实体类关键代码片段 /*** 部门表 sys_dept*/ public class SysDept extends BaseEntity {private static final lo…

Python基础入门

目录 1. 什么是Python&#xff1f; 2. 安装Python 3. Python基础语法 4. 数据结构 5. 文件操作 6. Python标准库 总结 1. 什么是Python&#xff1f; Python是一种高级编程语言&#xff0c;由Guido van Rossum于1991年发布。它以其简单易读的语法和强大的功能而闻名&…

高效22KW双向DCDC储能、充电电源模块项目设计开发

22kW 双向CLL谐振变换器的目标是输出电压范围宽、高效率和高功率密度的双向应用&#xff0c;如电动汽车车载充电器和储能系统。研究了一种新的灵活的 CLLC 双向谐振变换器增益控制方案&#xff0c;以便在充放电模式下实现高效率和宽电压增益范围。得益于 Wolfspeed C3MTM 1200V…

读《文明之光》第2册总结

《文明之光》系列大致按照从地球诞生到近现代的顺序讲述了人类文明进程的各个阶段&#xff0c;每个章节相对独立&#xff0c;全景式地展现了人类文明发展历程中的多样性。《文明之光》系列第二册讲述了从近代科学兴起&#xff0c;到工业革命时代&#xff0c;以及原子能应用这一…

【代码随想录】【算法训练营】【第46天】 [121]买卖股票的最佳时机 [122]买卖股票的最佳时机II [123]买卖股票的最佳时机III

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 46&#xff0c;周六&#xff0c;坚持很困难~ 题目详情 [121] 买卖股票的最佳时机 题目描述 121 买卖股票的最佳时机 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实…

Springboot应用的信创适配

CentOS7在2024.6.30停止维护后&#xff0c;可替代的Linux操作系统-CSDN博客 全面国产化之路-信创-CSDN博客 信创适配评测-CSDN博客 Springboot应用的信创适配 Springboot应用的信创适配&#xff0c;如上图所示需要适配的很多&#xff0c;从硬件、操作系统、中间件&#xff08…

开启声音的奇幻之旅:AI声音变换器的魔法秘籍与创意应用

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/这个充满科技魔力的时代&#xff0c;AI Voice Changer 就像一把神奇的钥匙&#xff0c;能为我们打开声音的魔法之门。今天&#xff0c;就让我带你…

基于CentOS Stream 9平台 安装/卸载 Redis7.0.15

已更正systemctl管理Redis服务问题 1. 官方下载地址 https://redis.io/downloads/#redis-downloads 1.1 下载或上传到/opt/coisini目录下&#xff1a; mkdir /opt/coisini cd /opt/coisini wget https://download.redis.io/releases/redis-7.0.15.tar.gz2. 解压 tar -zxvf re…

【实战分享】雷池社区版助力构建高可用、安全的Web应用架构

引言 在日益复杂的网络环境中&#xff0c;构建坚不可摧的安全防线成为每一位网站守护者的重要使命。本文将深入剖析一套集CDN加速、高效Nginx代理与雷池WAF深度防护于一体的现代网站安全架构设计&#xff0c;特别强调雷池WAF在此架构中的核心作用及其对整体安全性的提升策略。…

Linux中部署MySQL环境(本地安装)

进入官网&#xff1a;http://www.mysql.com 选择社区版本得到MySQL 选择对应的版本和系统进行安装 用wget进行软件包下载 wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.32-1.el9.x86_64.rpm-bundle.tar解压该软件包 tar -xf mysql-8.0.32-1.el9.x86_64.rpm-bu…

一键转换PDL至HTML,轻松驾驭文档格式,高效办公新纪元从此开启!

在信息爆炸的时代&#xff0c;文档格式繁多&#xff0c;如何高效处理这些文档成为了每个职场人士关注的焦点。现在&#xff0c;我们为您带来一款革命性的工具——一键转换PDL至HTML&#xff0c;让您轻松驾驭文档格式&#xff0c;开启高效办公新纪元&#xff01; 首先&#xff0…

Web Scraper抓取+pycharm分析淘宝商品

1、爬取淘宝商品前十页 下载的文件存放位置 2、导入项目编程需要使用到的Python库 copy: 用于创建对象的浅复制或深复制matplotlib 和 matplotlib.pyplot: 这两个库是Python中最常用的绘图库&#xff0c;用于生成各种静态、动态、交互式的图表和图形。numpy: 提供了强大的多维数…

基于YOLOv5的火灾检测系统的设计与实现

基于YOLOv5的火灾检测系统的设计与实现 概述系统架构主要组件代码结构功能描述YOLOv5检测器视频处理器主窗口 详细代码说明YOLOv5检测器类视频处理类主窗口类 使用说明环境配置运行程序操作步骤 检测示例图像检测视频检测实时检测 数据集介绍数据集获取数据集规模 YOLOv5模型介…

免费在线pdf处理工具:pdf文件压缩;pdf文件转word

1、pdf文件压缩 https://www.ilovepdf.com/zh-cn/compress_pdf 2、pdf文件转word https://www.xiaoyuanxiang.cn/pdf2word 效果还可以&#xff0c;只支持10M大小文件 https://www.pdf2go.com/zh/result#j23ff879c-49c5-4723-8038-dd6e3eefe601 https://huggingface.co/spa…

原生Hadoop3.X高可用配置方式

Hadoop3.X版本&#xff0c;在2017年左右就有了第一个alpha版本&#xff0c;但是那个时候刚出来&#xff0c;所以没有人使用&#xff0c;到2018年3.0.0版本作为第一个3&#xff0c;X正式发布&#xff0c;截止当前本文书写时间&#xff0c;3.X版本已经发展到了3.4&#xff0c;在H…