题目

最长湍流子数组当 A 的子数组 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]。
也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。返回 A 的最大湍流子数组的长度。示例 1:输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:输入:[4,8,12,16]
输出:2
示例 3:输入:[100]
输出:1

解决方法:

状态定义:increased[i]:以 arr[i] 结尾,并且 arr[i - 1] < arr[i] 的湍流子数组的长度;
decreased[i]:以 arr[i] 结尾,并且 arr[i - 1] > arr[i] 的湍流子数组的长度。
状态转移方程:increased[i] = decreased[i - 1] + 1 if arr[i - 1] < arr[i] for i > 0;
decreased[i] = increased[i - 1] + 1 if arr[i - 1] > arr[i] for i > 0。
初始化:只有一个元素的时候,湍流子数组的长度是 11;
输出:两个状态数组所有元素的最大值是最长湍流子数组的长度;
空间优化:空间优化:当前阶段状态只和上一个阶段状态有关,可以对状态数组进行重复利用。
public class Solution {public int maxTurbulenceSize(int[] arr) {int len = arr.length;if (len < 2) {return len;}// 以 arr[i] 结尾,并且 arr[i - 1] < arr[i] 的湍流子数组的长度int[] increased = new int[len];// 以 arr[i] 结尾,并且 arr[i - 1] > arr[i] 的湍流子数组的长度int[] decreased = new int[len];increased[0] = 1;decreased[0] = 1;int res = 1;for (int i = 1; i < len; i++) {if (arr[i - 1] < arr[i]) {increased[i] = decreased[i - 1] + 1;decreased[i] = 1;} else if (arr[i - 1] > arr[i]) {decreased[i] = increased[i - 1] + 1;increased[i] = 1;} else {increased[i] = 1;decreased[i] = 1;}res = Math.max(res, Math.max(increased[i], decreased[i]));}return res;}
}

总结:

之前做过最长的递增子数组,但是没有想到还可以有两个dp 数组结合使用,很妙。

动态规划真的很棒

所有的算法都是在积累,
只要有时间就学,几年之后,怎么也不差。
每个人都可能有一段时间,很忙,没时间看,但是一旦有时间,我们就要拿起来,继续学习。

https://leetcode-cn.com/problems/longest-turbulent-subarray/

算法---最长湍流子数组相关推荐

  1. LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)

    LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...

  2. 2021年2月8日 Leetcode每日一题:978. 最长湍流子数组

    最长湍流子数组 1.题目描述 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] ...

  3. 湍流参数计算c语言,力扣978.最长湍流子数组-C语言

    题目 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 知足下列条件时,咱们称其为湍流子数组:算法 若 i <= k < j,当 k 为奇数时, A[k] ...

  4. C++描述 LeetCode 978. 最长湍流子数组

    C++描述 LeetCode 978. 最长湍流子数组   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一 ...

  5. Leetcode 978. 最长湍流子数组

    978. 最长湍流子数组 显示英文描述 我的提交返回竞赛 用户通过次数196 用户尝试次数229 通过次数200 提交次数567 题目难度Medium 当 A 的子数组 A[i], A[i+1], . ...

  6. LeetCode 978. 最长湍流子数组(DP)

    1. 题目 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[ ...

  7. LeetCode-978:最长湍流子数组

    题目描述: 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[ ...

  8. 动态规划——最长湍流子数组

    问题来源:leetcode 978. 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 ...

  9. LeetCode 978 最长湍流子数组

    LeetCode 978 最长湍流子数组 题目链接 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k ...

最新文章

  1. 浅谈Promise对象在ReactNative中的使用
  2. 案例|数据中心UPS电源系统割接实施方案
  3. Scala模式匹配中的变量
  4. 【C语言简单说】十三:逻辑运算符||
  5. c语言 多线程 参数,如何用C语言实现多线程
  6. 前端学习(1910)vue之电商管理系统电商系统之完成用户的修改
  7. 【搜索/推荐排序】总结
  8. secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
  9. 5不能另存为dwg_5.建立数模
  10. MATLAB GUI的界面归一化问题
  11. 区块链 Fisco bcos 智能合约(11)-深入浅出Solidity
  12. 电商直播运营的思路流程
  13. 基本粒子群算法matlab 程序
  14. 史上最全的贝塞尔曲线(Bezier)全解(三):贝塞尔曲线实现满屏爱心
  15. 计算机自带拼图程序,电脑上比较好用的拼图软件?
  16. 前端高效开发必备的 js 库
  17. 《罗密欧与朱丽叶》--[英]莎士比亚
  18. uniapp兼容iPhoneX头部状态栏(刘海屏)和底部小横条
  19. python pygame K按键说明
  20. 低功耗蓝牙BLE之广播

热门文章

  1. python名称由来_Python的由来与使用介绍
  2. 岳阳机器人餐厅在哪_从机器人咖啡看未来餐饮行业大方向,如何才能活下去?...
  3. 高斯-赛德尔迭代法简介
  4. 翻译java_翻译示例代码
  5. 15、如何在Linux和Windows下清除DNS缓存
  6. Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function解决方法
  7. linux halt函数,常用Linux命令 reboot halt shutdown passwd vlock exit等
  8. 如何解一元一次方程视频_七年级数学教学视频-小邵课堂
  9. delphi中checkcombobox最大长度_并行光信号传输中的信道间传播时间偏差
  10. scrapy 怎么添加cookie_scrapy学习之爬虫练习平台5