LeetCode-978:最长湍流子数组
题目描述:
当 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
思路分析:
滑动窗口法:
设数组arr 的长度为 n,窗口[left,right](0≤left≤right≤n−1) 为当前的窗口,窗口内构成了一个「湍流子数组」。随后,我们要考虑下一个窗口的位置。
根据「湍流子数组」的定义,当 0<right<n−1 时:
如果 arr[right−1]<arr[right] 且 arr[right]>arr[right+1],则[left,right+1] 也构成「湍流子数组」,因此需要将right 右移一个单位;
如果 arr[right−1]>arr[right] 且 arr[right]<arr[right+1],同理,也需要将right 右移一个单位;
否则,[right−1,right+1] 无法构成「湍流子数组」,当 left<right 时,[left,right+1] 也无法构成「湍流子数组」,因此需要将 left 移到 right,即令left=right。
此外,我们还需要特殊考虑窗口长度为 1(即 left 和right 相等的情况):只要arr[right] =arr[right+1],就可以将 right 右移一个单位;否则,left 和right 都要同时右移。
class Solution {public int maxTurbulenceSize(int[] arr) {int n = arr.length;int ret = 1;int left = 0, right = 0;while (right < n - 1) {if (left == right) {if (arr[left] == arr[left + 1]) {left++;}right++;} else {if (arr[right - 1] < arr[right] && arr[right] > arr[right + 1]) {right++;} else if (arr[right - 1] > arr[right] && arr[right] < arr[right + 1]) {right++;} else {left = right;}}ret = Math.max(ret, right - left + 1);}return ret;}
}
复杂度分析
时间复杂度:O(n),其中 n 为数组的长度。窗口的左右端点最多各移动 n 次。
空间复杂度:O(1)。只需要维护常数额外空间。
动态规划法:
对于最长连续子数组问题,使用动态规划求解时,我们经常定义状态 dp[i] 为:以 i 位置结尾的最长连续子数组的长度,因为这个状态可以反映 i 位置及其前面区间的情况。下一个位置 i + 1 可以根据 dp[i] 就知道了前面的情况,再根据 arr[i + 1] 和 arr[i] 的大小关系,能更新状态 dp[i + 1]。
对于本题,如果只定一个状态数组是不够的,因为我们只有区分了 i 位置是在增长还是在降低,才能判断 i + 1 位置是否能续上前面的波浪。所以,我们需要定义两个状态数组,分别表示以 i 结尾的在增长和降低的最长湍流子数组长度。
状态的定义:
定义 up[i] 表示以位置 i 结尾的,并且 arr[i - 1] < arr[i] 的最长湍流子数组长度。
定义 down[i] 表示以位置 i 结尾的,并且 arr[i - 1] > arr[i] 的最长湍流子数组长度。
up[i] 和 down[i] 初始化都是 1,因为每个数字本身都是一个最小的湍流子数组。
状态转移方程:
up[i] = down[i - 1] + 1,当 arr[i - 1] < arr[i];
down[i] = up[i - 1] + 1,当 arr[i - 1] > arr[i];
解释:湍流子数组的增长和降低是交替的。
(图像来自leetcode题解区:https://leetcode-cn.com/problems/longest-turbulent-subarray/solution/yi-zhang-dong-tu-xiang-jie-dong-tai-gui-wrwvn/)
class Solution {public int maxTurbulenceSize(int[] arr) {int res = 1, up = 1, down = 1;for (int i = 1; i < arr.length; i++) {if (arr[i - 1] < arr[i]) {up = down + 1;down = 1;} else if (arr[i - 1] > arr[i]) {down = up + 1;up = 1;} else {up = 1;down = 1;}res = Math.max(res, Math.max(up, down));}return res;}
}
LeetCode-978:最长湍流子数组相关推荐
- LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)
LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...
- 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[ ...
- 2021年2月8日 Leetcode每日一题:978. 最长湍流子数组
最长湍流子数组 1.题目描述 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] ...
- 湍流参数计算c语言,力扣978.最长湍流子数组-C语言
题目 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 知足下列条件时,咱们称其为湍流子数组:算法 若 i <= k < j,当 k 为奇数时, A[k] ...
- 978. 最长湍流子数组
链接:978. 最长湍流子数组 题解:https://leetcode-cn.com/problems/longest-turbulent-subarray/solution/zui-chang-tu ...
- leetcode 978. Longest Turbulent Subarray | 978. 最长湍流子数组(Java)
题目 https://leetcode.com/problems/longest-turbulent-subarray/ 题解 虽然 similar questions 没列出来,但能想到之前做过的( ...
- 动态规划——最长湍流子数组
问题来源:leetcode 978. 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 ...
最新文章
- vue select js 设置默认值
- Manacher算法 , 实例 详解 . NYOJ 最长回文
- html 传参数 菜单自动展开,【HTML5】Jquery打造竖向伸缩/展开菜单
- Python基本语法_集合set/frozenset_内建方法详解
- Java json序列化库gson(2)
- 蓝桥杯入门练习1-4(python)
- matplotlib setting zh-hans
- 通过Ftp put命令上传导致文件损坏的解决办法
- 【BZOJ3609】人人尽说江南好,博弈
- 安装nagios中php安装报错 configure error xml2-config not foud
- java学习笔记(五)集合
- JDK安装以及配置环境变量详细步骤
- WSUS服务器点击报告报错解决办法
- scikit-learn中交叉验证及其用于参数选择、模型选择、特征选择的例子
- Monte Carlo算法
- Apple商务管理分发
- VDI IDV VOI
- UDP与TCP协议详解
- 探秘前端 CRDT 实时协作库 Yjs 工程实现
- PCM开发板模块实验指导--有刷直流马达速度控制实验
热门文章
- 阿里Java研发工程师实习面经
- Thinkphp3.2版本Controller和Action的访问方法
- Ubuntu 10.04 分辨率调整
- ubuntu apt命令
- 安卓mysql插入数据_Android批量插入数据到SQLite数据库的方法
- SQL必知必会-过滤数据
- c语言1000行代码,【图片】【标题党】论我是如何一分钟写1000行代码的【c语言吧】_百度贴吧...
- android mysql 乱码_android POST数据遇到的UTF-8编码(乱码)问题解决办法
- python 获取进程池 sleeping_Python 进程操作之进程池--Pool
- Oracle数据库常用undo查询思路