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

  • 一、题目
  • 二、分析及代码
    • 1. 动态规划(一维数组)
      • (1)思路
      • (2)代码
      • (3)结果
    • 2. 动态规划(单个数字)
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

当 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

提示:

  • 1 <= A.length <= 40000
  • 0 <= A[i] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-turbulent-subarray
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、分析及代码

1. 动态规划(一维数组)

(1)思路

设计一个数组 dp[n],表示到第 i 个数字时当前湍流子数组的长度,则状态转移过程为:

  • 若当前数字与前一数字相等,dp[i] = 1
  • 若当前数字符合湍流数组要求,dp[i] = dp[i - 1] + 1
  • 若当前数字与前一数字不相等但不符合湍流数组要求,dp[i] = 2

dp[i] 的最大值即为目标解。

(2)代码

class Solution {public int maxTurbulenceSize(int[] arr) {if (arr.length == 1)return 1;int[] dp = new int[arr.length];//dp[i]表示到第i个数字时当前湍流子数组的长度dp[0] = 1;dp[1] = (arr[0] == arr[1]) ? 1 : 2;int n = arr.length, ans = dp[1];for (int i = 2; i < n; i++) {if (arr[i] == arr[i - 1])dp[i] = 1;else if ((arr[i] > arr[i - 1] && arr[i - 1] < arr[i - 2]) || (arr[i] < arr[i - 1] && arr[i - 1] > arr[i - 2])) {dp[i] = dp[i - 1] + 1;ans = Math.max(ans, dp[i]);} elsedp[i] = 2;}return ans;}
}

(3)结果

执行用时 :6 ms,在所有 Java 提交中击败了 87.95% 的用户;
内存消耗 :45.1 MB,在所有 Java 提交中击败了 7.72% 的用户。

2. 动态规划(单个数字)

(1)思路

上述方法计算过程中,dp[i] 的状态只与 dp[i - 1] 有关,因此可直接用一个整数替代一维数组。

(2)代码

class Solution {public int maxTurbulenceSize(int[] arr) {if (arr.length == 1)return 1;int len = (arr[0] == arr[1]) ? 1 : 2;int n = arr.length, ans = len;for (int i = 2; i < n; i++) {if (arr[i] == arr[i - 1])len = 1;else if ((arr[i] > arr[i - 1] && arr[i - 1] < arr[i - 2]) || (arr[i] < arr[i - 1] && arr[i - 1] > arr[i - 2])) {len++;ans = Math.max(ans, len);} elselen = 2;}return ans;}
}

(3)结果

执行用时 :6 ms,在所有 Java 提交中击败了 78.92% 的用户;
内存消耗 :41.8 MB,在所有 Java 提交中击败了 56.40% 的用户。

三、其他

暂无。

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

  1. [Swift]LeetCode978. 最长湍流子数组 | Longest Turbulent Subarray

    原文地址:https://www.cnblogs.com/strengthen/p/10294636.html A subarray A[i], A[i+1], ..., A[j] of A is s ...

  2. leetcode 978. 最长湍流子数组(动态规划)

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

  3. leetcode 978. 最长湍流子数组(滑动窗口)

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

  4. 力扣978最长湍流子数组——Python解答

    我们采用DP解法 up = [1] * len(arr)down = [1] * len(arr)ans = 1for i in range(1, len(arr)):if arr[i] > a ...

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

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

  6. LeetCode 978 最长湍流子数组

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

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

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

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

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

  9. 【线性 dp】B003_LC_最长湍流子数组(读题 dp / 双指针)

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

最新文章

  1. 006商城项目:该项目的路径访问问题
  2. Java基础--继承、this、super、抽象类
  3. Java 设计模式之状态模式
  4. java中的json_java中的json使用
  5. linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
  6. 神经网络-GoogleNet的发展,介绍,贡献
  7. Oracle Crystal ball 11.1.* 注册码
  8. Android 系统签名(踩坑记)
  9. html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
  10. killer网卡ubantu下不能wifi联网的问题(据说就是intel网卡)(心酸血泪史)(不升级内核)
  11. 姿态传感器的原理与应用文献笔记
  12. mac安装搜狗输入法
  13. 老公分不到股份?问题根源是创业者人才观缺失
  14. hdu 5442 Favorite Donut 后缀数组
  15. 中英文切换_值得收藏|不重装软件实现ArcGIS中英文版本之间切换
  16. ROS机器人的远程启动和控制过程
  17. OpenGL/C++实战——C++实现太阳系行星系统
  18. 网络发现已关闭网络计算机和设备不可见
  19. netty 通道接口定义
  20. zip直链生成网站_防止赖床的闹钟软件、免费好用的看图软件、色卡生成器 今天有什么?...

热门文章

  1. 没什么可以阻挡我要坚持到底
  2. uniapp做h5页面刷新页面404配置nginx后端开启伪静态
  3. Android手写优化
  4. NFS的创建和使用及其快捷脚本
  5. 第6章 数据集成、变换与规约2
  6. ADSL组建局域网快捷方案 (转)
  7. Ubuntu20.04使用中科大镜像源安装更新nginx
  8. [嘭嘭养成记]2. 在运行时将完整动作分割成局部动作
  9. 鱿鱼游戏玻璃桥文字游戏
  10. 大神F2安装google服务框架教程