首页 > 其他分享 >动态规划 —— 子数组系列-最长湍流子数组

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

时间:2024-11-18 11:16:55浏览次数:3  
标签:位置 湍流 int 填表 ret 数组 最长

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;//因为最少也是1
        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;
            ret=max(ret,max(f[i],g[i]));
        }
        return ret;
    }
};

未完待续~

标签:位置,湍流,int,填表,ret,数组,最长
From: https://blog.csdn.net/hedhjd/article/details/143843022

相关文章

  • 最大子数组和
    最大子数组和题目给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组是数组中的一个连续部分。示例示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释:连续子数组[4,-1,2,1]的和最大,为6。示例2:输入:nums=......
  • 数组
    下面有关数组的叙述中,只有()是正确的:A)虽然不能对数组进行整体的赋值和IO等,但可以将整个数组作为参数传递给函数,函数也可以返回整个数组!B)C要求形参和相对应的实参都必须是类型相同的数组。C)形参数组和实参数组为同一数组,共同拥有一段内存空间。D)C语言规定数组名就是数......
  • 941. 有效的山脉数组
    题目自己写的classSolution{public:boolvalidMountainArray(vector<int>&arr){intl=0,r=1;boolup=true,change=false;if(arr.size()<3)returnfalse;if(arr[r]<arr[l])......
  • 代码随想录:长度最小的子数组
    代码随想录:长度最小的子数组现在不像考研那时候,每天时间都是固定的,以后可能还是以周为单位定目标比较好一点滑动窗口问题,之后记得和计算机网络里的滑动窗口对比,并且和背包问题对比classSolution{public:intminSubArrayLen(inttarget,vector<int>&nums){i......
  • STL之动态数组
    一、标准模板库(StandardTemplateLibrary,STL)是HP公司开发的一个C++模板库,包含一些常用的数据结构和算法。具有以下的组件:1.容器:容纳包含一组元素的对象。2.迭代器:提供访问容器的方法3.函数对象4.算法二、STL之向量——vector   vector是c++标准库提供的一个变长数......
  • 【C++笔记】一维数组元素处理
    目录1.插入元素方法代码2.删除元素方法代码3.交换元素方法代码1.插入元素方法概念:插入元素是指在数组的某个位置添加一个新元素,并将原来的元素向后移动。例如,将5插入到数组[1,2,4,6]的第二个位置,结果变为[1,5,2,4,6]。关键点:确定插入位置:首先要明......
  • 一文搞懂!数组作为函数输入如何声明?
    一维数组函数形参定义:voidarray_print(inta[])一维数组指针函数形参定义:voidarray_print(int*a)二维数组函数形参定义://必须指明数组的列数,数组的行数没有太大关系//因为函数调用时传递的是一个指针,它指向由行向量构成的一维数组//所以以下两种声明方式都可以......
  • (nice!!!)(LeetCode) 3240. 最少翻转次数使二进制矩阵回文 II (分类讨论、数组)
    题目:3240.最少翻转次数使二进制矩阵回文II思路:分类讨论,需要对行和列的个数进行讨论,时间复杂度为0(nm),细节看注释。C++版本:classSolution{public:intminFlips(vector<vector<int>>&grid){intans=0;intn=grid.size(),m=grid[0].size();......
  • 除自身以外数组的乘积
    力扣链接:.-力扣(LeetCode)给你一个整数数组 nums,返回数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32位 整数范围内。请 不要使用除法,且在 O(n) ......
  • 树状数组的两种写法
    首先是下标从\(1\simn\),使用\(lowbit(x)=x\&\–x\)template<typenameT>classFenwick{public:vector<T>fenw;intn;Fenwick(int_n):n(_n){fenw.resize(n+1);}voidmodify(intx,Tw){while(x<=n){......