LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)
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)相关推荐
- [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 ...
- leetcode 978. 最长湍流子数组(动态规划)
978. 最长湍流子数组 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] &g ...
- leetcode 978. 最长湍流子数组(滑动窗口)
当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[k+1],且当 ...
- 力扣978最长湍流子数组——Python解答
我们采用DP解法 up = [1] * len(arr)down = [1] * len(arr)ans = 1for i in range(1, len(arr)):if arr[i] > a ...
- C++描述 LeetCode 978. 最长湍流子数组
C++描述 LeetCode 978. 最长湍流子数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一 ...
- LeetCode 978 最长湍流子数组
LeetCode 978 最长湍流子数组 题目链接 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k ...
- Leetcode 978. 最长湍流子数组
978. 最长湍流子数组 显示英文描述 我的提交返回竞赛 用户通过次数196 用户尝试次数229 通过次数200 提交次数567 题目难度Medium 当 A 的子数组 A[i], A[i+1], . ...
- LeetCode 978. 最长湍流子数组(DP)
1. 题目 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[ ...
- 【线性 dp】B003_LC_最长湍流子数组(读题 dp / 双指针)
一.Problem 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > ...
最新文章
- 006商城项目:该项目的路径访问问题
- Java基础--继承、this、super、抽象类
- Java 设计模式之状态模式
- java中的json_java中的json使用
- linux内核epub,Android底层开发技术实战详解——内核、移植和驱动(第2版)[EPUB][MOBI][AZW3][42.33MB]...
- 神经网络-GoogleNet的发展,介绍,贡献
- Oracle Crystal ball 11.1.* 注册码
- Android 系统签名(踩坑记)
- html 调用离线地图,百度地图API1.1制作的离线地图控件(html+webbroswer)
- killer网卡ubantu下不能wifi联网的问题(据说就是intel网卡)(心酸血泪史)(不升级内核)
- 姿态传感器的原理与应用文献笔记
- mac安装搜狗输入法
- 老公分不到股份?问题根源是创业者人才观缺失
- hdu 5442 Favorite Donut 后缀数组
- 中英文切换_值得收藏|不重装软件实现ArcGIS中英文版本之间切换
- ROS机器人的远程启动和控制过程
- OpenGL/C++实战——C++实现太阳系行星系统
- 网络发现已关闭网络计算机和设备不可见
- netty 通道接口定义
- zip直链生成网站_防止赖床的闹钟软件、免费好用的看图软件、色卡生成器 今天有什么?...