首页 > 编程语言 >(算法)最⻓湍流⼦数组————<动态规划>

(算法)最⻓湍流⼦数组————<动态规划>

时间:2024-10-17 20:49:04浏览次数:8  
标签:arr 元素 湍流 int 位置 算法 数组

1. 题⽬链接:978.最⻓湍流⼦数组

2. 题⽬描述:

3. 解法(动态规划):

算法思路:

1. 状态表⽰:

我们先尝试定义状态表⽰为: dp[i] 表⽰「以i 位置为结尾的最⻓湍流数组的⻓度」。 但是,问题来了,如果状态表⽰这样定义的话,以i 位置为结尾的最⻓湍流数组的⻓度我们没法 从之前的状态推导出来。

因为我们不知道前⼀个最⻓湍流数组的结尾处是递增的,还是递减的。因 此,我们需要状态表⽰能表⽰多⼀点的信息:要能让我们知道这⼀个最⻓湍流数组的结尾是「递 增」的还是「递减」的。 因此需要两个dp 表: 

f[i] 表⽰:以i 位置元素为结尾的所有⼦数组中,最后呈现「上升状态」下的最⻓湍流数 组的⻓度;

g[i] 表⽰:以i 位置元素为结尾的所有⼦数组中,最后呈现「下降状态」下的最⻓湍流数 组的⻓度。

2. 状态转移⽅程:

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

        i. arr[i] > arr[i - 1] :如果i 位置的元素⽐i - 1 位置的元素⼤,说明接下来 应该去找i -1 位置结尾,并且i - 1 位置元素⽐前⼀个元素⼩的序列,那就是g[i - 1] 。更新f[i] 位置的值: f[i] = g[i - 1] + 1 ;

        ii. arr[i] < arr[i - 1] :如果i 位置的元素⽐i - 1 位置的元素⼩,说明接下来 应该去找i - 1 位置结尾,并且i - 1 位置元素⽐前⼀个元素⼤的序列,那就是 f[i - 1] 。更新g[i] 位置的值: g[i] = f[i - 1] + 1 ;

        iii. arr[i] == arr[i - 1] :不构成湍流数组。

3. 初始化:

所有的元素「单独」都能构成⼀个湍流数组,因此可以将dp 表内所有元素初始化为1 。 由于⽤到前⾯的状态,因此我们循环的时候从第⼆个位置开始即可。

4. 填表顺序:

毫⽆疑问是「从左往右,两个表⼀起填」。

5. 返回值:

应该返回「两个dp 表⾥⾯的最⼤值」,我们可以在填表的时候,顺便更新⼀个最⼤值。 

C++算法代码: 

class Solution 
{
public:
    int maxTurbulenceSize(vector<int>& arr) 
    {
        int n=arr.size();
        //建表
        vector<int>f(n,1);  //以i位置为结尾最后趋向为上升的湍流数组长度
        vector<int>g(n,1);  //以i位置为结尾最后趋向为下降的湍流数组长度
        //填表
        int max_num=1;
        for(int i=1;i<n;i++)
        {
            int a=arr[i-1],b=arr[i];
            if(a>b)
            {
                f[i]=g[i-1]+1;
            }
            else if(a<b)
            {
                g[i]=f[i-1]+1;
            }
            max_num=max(max_num,max(f[i],g[i]));
        }
        //返回值
        return max_num;
    }
};

Java算法代码:

class Solution
{
	public int maxTurbulenceSize(int[] arr)
	{
		// 1. 创建 dp 表 
		// 2. 初始化 
		// 3. 填表 
		// 4. 返回值 
		int n = arr.length;
		int[] f = new int[n];
		int[] g = new int[n];
		for (int i = 0; i < n; i++) f[i] = g[i] = 1;
		int ret = 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 = Math.max(ret, Math.max(f[i], g[i]));
		}
		return ret;
	}
}

标签:arr,元素,湍流,int,位置,算法,数组
From: https://blog.csdn.net/2301_79580018/article/details/143028269

相关文章

  • (算法)等差数列划分————<动态规划>
    1.题⽬链接:413.等差数列划分2.题⽬描述:3.解法(动态规划):算法思路:1.状态表⽰:由于我们的研究对象是「⼀段连续的区间」,如果我们状态表⽰定义成[0,i]区间内⼀共有多少等差数列,那么我们在分析dp[i]的状态转移时,会⽆从下⼿,因为我们不清楚前⾯那么多的「等差数列都在什......
  • 图论day64 :最短路径算法 | SPFA(Bellman_ford的队列优化版)、城市间货物运输 I、Ⅱ、Ⅲ
    图论day64:最短路径算法|SPFA(Bellman_ford的队列优化版)、94.城市间货物运输I(卡码网)【SPFA算法+邻接表优化】、95.城市间货物运输II(判断负权回路)、96.城市间货物运输III【已知有负权回路,该如何计算】、Bellman_ford算法思维导图汇总SPFA(Bellman_ford的队列优化版)94......
  • 从单细胞和空间转录组学推断模式驱动的细胞间流动(Flowsig)--生信算法笔记
    **Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics**Almet,A.A.,Tsai,YC.,Watanabe,M.etal.Inferringpattern-drivingintercellularflowsfromsingle-cellandspatialtranscriptomics.NatMethods21,1806......
  • 大数据传播模型与算法——影响力最大化
    【大数据网络传播模型和算法-陈卫】——影响力最大化【持续更新】本人当前研究方向为影响力最大化(基于机器学习的组合优化算法)。目前在学习陈卫编著的《大数据传播模型与算法》,该系列会定期分享影响力最大化的学习内容(持续更新…),希望大家能够一起交流学习!前言什么是影响?......
  • 【关联规则挖掘算法‌】基于模式增长的关联规则挖掘算法
    目录一、基于模式增长的关联规则挖掘算法概述二、基于模式增长的关联规则挖掘算法优缺点和改进2.1  基于模式增长的关联规则挖掘算法优点2.2  基于模式增长的关联规则挖掘算法缺点2.3  基于模式增长的关联规则挖掘算法改进三、基于模式增长的关联规则挖掘算法编程......
  • 【数据结构】之数组详解
    数组是数据结构中最基础的概念之一,它在编程中被广泛应用。理解数组的工作原理、操作方式以及底层实现,对于我们构建更复杂的数据结构和算法至关重要。本文将从多个角度深入剖析数组,并以Java语言示例进行讲解,帮助你建立对数组的深刻理解。一、什么是数组?数组是一种线性数据结构......
  • 雪花算法------用于生成数据库中的主键、消息队列的消息ID等的算法-----算法特点,id结
    雪花算法(SnowflakeAlgorithm)是一种由Twitter公司开发的分布式ID生成算法,用于在分布式系统中生成全局唯一的ID。这种算法非常适合需要高并发、低延迟以及大量唯一ID生成的应用场景,比如数据库中的主键、消息队列的消息ID等。雪花算法的主要特点包括:唯一性:生成的ID在全球范围内......
  • 算法
    1.常见算法点击查看代码*冒泡排序:重复数列,一次比较两个元素,如果顺序错误就交换*选择排序:每次选择未排序的部分最大或最小元素,放到已排序末尾*插入排序:将未排序的元素逐个插入到已排序部分的合适位置*快速排序:选择一个基准元素,将小于的放左边,大的放右边,再对左右递归进行......
  • 图论中的最小生成树算法
    错题考察的知识点是图论中的最小生成树算法,特别是Prim算法和Kruskal算法。这两种算法都是用来寻找无向连通图中的最小生成树的。最小生成树是指连接图中所有顶点的边的集合,且这些边的总权重最小,同时保证任意两个顶点之间都是连通的。Prim算法:原理:从一个任意顶点开始,逐步增加新......
  • 实验三: JavaScript数组与函数
    实验目的熟练掌握常用JavsScript的数组、自定义函数、作用域。实验内容数组定义及元素获取;数组的遍历;数组内容的增删改查;数组的排序;数组的反转、截取、合并、元素拼接函数的声明;函数的调用;匿名函数;作用域。实验步骤:数组定义及元素获取;数组的遍历;数组内容的增删改查......