首页 > 编程语言 >动态规划算法之子数组系列----最长湍流子数组

动态规划算法之子数组系列----最长湍流子数组

时间:2024-12-24 21:02:43浏览次数:5  
标签:arr 湍流 nums 位置 ret ---- 数组

最长湍流子数组 

最长湍流子数字

问题描述

给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。如果比较符号在子数组中的每个相邻元

示例 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

湍流子数组的简单解释:

算法原理

1. 状态表示

以 i 位置结尾的数组,结合 i - 1 位置可以分为上升或下降趋势,判断是否为湍流数组还要结合 i - 1以前的位置进行判断,故需要两个dp表进行状态表示。

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

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

2. 状态转移方程

(1)对于f[i]可以分以下情况讨论

  • nums[i-1]  >= nums[i]   则nums[i]自己构成一个湍流子数组,f[i] = 1;
  • nums[i-1] < nums[i], 则i-1以前需要呈现一个下降趋势,故有 f[i] = g [i-1] +1;

(2)对于g[i]可以分为以下情况讨论

  • nums[i-1]  >nums[i]    则i-1以前需要呈现一个上升趋势,故有 g[i] = f [i-1] +1;;
  • nums[i-1] <= nums[i], 则nums[i]自己构成一个湍流子数组,g[i] = 1;

3. 初始化

在最差的情况下,每个元素也可以构成一个湍流子数组,即f 表和g表最差情况下都是1,故可以将f和g表中的全部元素初始化为1 

4.填表顺序

从左向右,两张表一起填

5.返回值

结合题意和fg表的状态表示,可以知道本题返回的是 f 和 g 表中的最大值

代码编写

int maxTurbulenceSize(vector<int>& arr) 
    {
        int n = arr.size();
        vector<int> f(n,1);
        auto g = f;
        int ret = 1;  //最差情况就是1 所以将ret初始值设置为1
        for(int i = 1; i < n; i++)
        {
            //i-1 到 i 位置呈下降趋势,则i-2到i-1 位置需要呈现上升趋势
            if(arr[i-1] > arr[i]) g[i] = f[i-1] + 1;
            
            //i-1 到 i 位置呈上升趋势,则i-2到i-1 位置需要呈现下降趋势
            if(arr[i-1] < arr[i]) f[i] = g[i-1] + 1;

            //返回f表和g表中的最大值
            ret = max(ret,max(f[i],g[i]));
        }
        return ret;
    }

复杂度分析

本题使用一次for循环、创建了两个大小为n 的数组,所以时间复杂度是O(n),空间复杂度是O(n)。

标签:arr,湍流,nums,位置,ret,----,数组
From: https://blog.csdn.net/m0_59464874/article/details/144648169

相关文章

  • 动态规划算法之子序列问题----环绕字符串中唯一的子字符串
    环绕字符串中唯一的字符串https://leetcode.cn/problems/unique-substrings-in-wraparound-string/submissions/589070606/题目描述定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串,所以 base 看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzab......
  • 负载均衡式在线OJ
    文章目录项目介绍所用技术与开发环境所用技术开发环境项目框架compiler_server模块compiler编译功能comm/util.hpp编译时的临时文件comm/log.hpp日志comm/util.hpp时间戳comm/util.hpp检查文件是否存在compile_server/compiler.hpp编译功能总体编写runner运行功能......
  • 响应式布局、移动端布局
    移动端布局主要分为固定布局和流动布局(响应式布局),固定布局即使用固定单位如px,响应式布局则使用相对单位来使布局适应不同设备,有:<!--px%vhvwemrem-->1、 固定像素    .fu{      width:500px;      height:500px;    ......
  • DALD论文极速读
    本篇博客是对论文DALD:ImprovingLogits-basedDetectorwithoutLogitsfromBlack-boxLLMs的讲解该篇论文被NeurIPS2024收录该论文是在fast-detect-gpt方法上的改动,fast-detect-gpt的方法可以参见我的这篇文章fast-detect-gpt的方法可以简单概括为:使用两个模型,一个......
  • 平安夜
        《平安夜》  作家/罗光记‌‎ 在历史的长河中,有些夜晚因特殊的意义而被永远镌刻。1950年的12月24日,一个原本应是欢歌笑语、家人团聚的平安夜,却在遥远的朝鲜半岛的长津湖畔,见证了一场惊心动魄的战役,也铭记了无数英烈的无畏与牺牲。‌‎‌‎  此刻,当我......
  • Imitate Before Detect论文极速读
    本文讲解文章ImitateBeforeDetect:AligningMachineStylisticPreferenceforMachine-RevisedTextDetection的方法ImitateBeforeDetect一种在fast-detect-gpt的zero-shot方法上的微调方法之前写过专门关于fast-detect-gpt的文章文章首先提出虽然ast-detect-gpt......
  • Python+Vue3+Django银行信用卡额度管理系统的设计与实现
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、......
  • Python+Vue3+Django新闻发布管理系统设计与实现
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、......
  • 医院食堂订餐系统Python+Vue3+Django(Pycharm毕业设计 mysql)
    文章目录具体实现截图项目介绍和开发技术介绍开发技术核心代码部分展示项目结构分析文章目录/写作提纲参考源码/演示视频获取方式具体实现截图项目介绍和开发技术介绍创新之处(1)系统资源闭环整合,实现了综合功能高度集成。(2)采用DJANGO框架,开发软件更加方便、快......
  • Zotero翻译服务DeepL(Pro)密钥免费获取
            DeepL以其卓越的翻译质量著称,能够生成非常自然、流畅的译文,几乎可以与人工翻译相媲美。下面介绍如何在zotero中免费使用DeepL(Pro)。点开下面链接邀请码:tsYF-dFFL4邀请链接:https://deepl-pro.com/#/translate?referral_code=tsYF-dFFL4        ......