【学会动态规划】最长湍流子数组(23)

简介: 【学会动态规划】最长湍流子数组(23)

动态规划怎么学?

学习一个算法没有捷径,更何况是学习动态规划,

跟我一起刷动态规划算法题,一起学会动态规划!

1. 题目解析

题目链接:978. 最长湍流子数组 - 力扣(LeetCode)

题目说要找出最长的湍流子数组,但是他的题干太长了,而且不止所云,

所以我们直接通过用例来分析什么是湍流子数组,

通过示例一我们知道了,湍流子数组就是一个大一小一个大一个小的子数组,

通过示例二我们知道了,如果数组一直是递增/递减,最长就是 2,

通过示例三我们知道了,如果数组只有一个元素,那么长度就是 1。

2. 算法原理

1. 状态表示

我们还是从 dp [ i ] 来分析,

dp [ i ] 表示以 i 位置为结尾的所有子数组中,最长的湍流子数组的长度。

实际上他一共存在两种情况:

f [ i ] 表示 i 位置为结尾的所有子数组中,上升状态时最长的湍流子数组的长度,

g [ i ] 表示 i 位置为结尾的所有子数组中,下降状态时最长的湍流子数组的长度,

2. 状态转移方程

f [ i ] 分为三种情况:

当 f [ i - 1 ] > f [ i ] ,要想进入上升状态就得重新计算,所以变成 1

当 f [ i - 1 ] < f [ i ] ,下降状态的最长长度就是 g [ i - 1 ] + 1

当 f [ i - 1 ] == f [ i ] ,要想进入平缓状态就得重新计算,所以变成 1

g [ i ] 也同样是这三种情况:

当 g [ i - 1 ] > g [ i ] ,上升状态的最长长度就是 f [ i - 1 ] + 1

当 g [ i - 1 ] < g [ i ] ,要想进入下降状态就得重新计算,所以变成 1

当 g [ i - 1 ] == g [ i ] ,要想进入平缓状态就得重新计算,所以变成 1

3. 初始化

我们可以把所有位置先初始化成 1 作为初始值

4. 填表顺序

从左往右,两个表一起填。

5. 返回值

返回两个表里面的最大值。

3. 代码编写

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();
        vector<int> f(n, 1), g(n, 1);
        int ans = 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;
            ans = max(ans, max(f[i], g[i]));
        }
        return ans;
    }
};

写在最后:

以上就是本篇文章的内容了,感谢你的阅读。

如果感到有所收获的话可以给博主点一个哦。

如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~

相关文章
|
7月前
|
机器学习/深度学习 算法 测试技术
【动态规划】【最长子序列】2901. 最长相邻不相等子序列 II
【动态规划】【最长子序列】2901. 最长相邻不相等子序列 II
|
7月前
|
算法 C++
【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目
【动态规划】【子序列除重】【C++算法】1987不同的好子序列数目
|
7月前
|
机器学习/深度学习 算法 测试技术
【动态规划】C++算法:446等差数列划分 II - 子序列
【动态规划】C++算法:446等差数列划分 II - 子序列
|
人工智能
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 11】等差数列划分&& 最长湍流子数组
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 13】最长递增子序列&& 摆动序列
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
【动态规划刷题 16】最长等差数列 (有难度) && 等差数列划分 II - 子序列
102 0
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
【动态规划刷题 15】最长定差子序列&& 最长的斐波那契子序列的长度
|
2月前
|
算法
动态规划算法学习二:最长公共子序列
这篇文章介绍了如何使用动态规划算法解决最长公共子序列(LCS)问题,包括问题描述、最优子结构性质、状态表示、状态递归方程、计算最优值的方法,以及具体的代码实现。
182 0
动态规划算法学习二:最长公共子序列
|
7月前
|
算法 程序员
【算法训练-动态规划 二】【线性DP问题】连续子数组的最大和、乘积最大子数组、最长递增子序列
【算法训练-动态规划 二】【线性DP问题】连续子数组的最大和、乘积最大子数组、最长递增子序列
118 0
|
算法 C语言 C++
【动态规划】最长上升子序列(单调队列、贪心优化)
本篇是对最长上升子序列基础做法的一种优化
73 0