2021年2月8日 Leetcode每日一题:978. 最长湍流子数组
最长湍流子数组
1.题目描述
当 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 的最大湍流子数组的长度。
2.示例
示例 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
3.读题
其实,乍一看这个题目我也没太看懂,感觉挺抽象的。前两个条件让这个题目看起来非常复杂,既需要考虑奇偶,又需要考虑大小。幸好有第三个条件,让题意变得明朗了起来。
第三个条件是这么说的:如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组
。也就是说,假如在数组的相邻元素之间插入一个比较符号来描述两个元素之间的大小关系,那么湍流子数组的每个相邻比较符号是相反的。
仔细思考一下,这个条件包含着一些隐含的信息:
1.比较符号不包含等号,如果出现了相等的相邻数字,则湍流子数组中断
2.湍流子数组如果中断,则新的湍流子数组的长度需要重新计数
所以,题目要求是求湍流子数组的最大长度,而一个输入数组中可能包含多个湍流子数组,需要从头遍历,多次比较。
此外,由示例3可知,如果单个元素就可以作为一个湍流子数组,因此湍流子数组的长度至少为1。换句话说,如果当前子数组中只有一个元素,后续元素与其组成更长的子数组不需要考虑其之前的状态。
4.思路
由于湍流子数组是否能延续只与上一个比较符有关,因此可以从头到尾遍历来解决这个问题。
一开始考虑用一个布尔值来保存上一步的比较状态,再用一个整型来保存到上一步为止的最长湍流子数组长度。但是,如果上一步的比较结果是等于号,那么就无法用该布尔值来表示,需要使用额外的符号或者额外的判断。
但是,注意到,每一步与上一个数字之间的比较关系只有三种,即大于、小于和等于,那么可以用两个数字up和down来记录这一步的状态,其中up代表这个数字大于上一个数字时的最长湍流子数组长度,down代表这个数字小于这个数字时的最长湍流子数组长度:
1.如果这个数字比上一个数字要小,若需要延续湍流子数组,则上一个数字需要比上上个数字大才能延续。换句话说,这一步可以延续上一步比上上一步大的情况即上一步的up状态,所以这一步的down状态为上一步的up状态值+1。同时,这个数字比上个数字小,所以这一步就无法组成up的状态了,因此这一步的up湍状态为1即其本身。
2.同理,如果这个数字比上一个数字大,则这一步的up=上一步的down+1,这一步的down=1。
3.如果这个数字和上一个数字相等,那么即无法延续上一步的up子数组长度,也无法延续上一步的down子数组长度,所以这一步的up和down的状态只能为1,重新计算。
由于每一步都有可能会重置up或者down的值,因此每一步更新了up和down的值之后,都要更新一下最大子数组长度max的值。
5.代码
代码如下,应该还是很简单易懂的。
class Solution {public int maxTurbulenceSize(int[] A) {int up = 1;int down = 1;int max = 1;for(int i=1;i<A.length;i++){if(A[i]>A[i-1]){up = down+1;down = 1;}else if(A[i]<A[i-1]){down = up+1;up = 1;}else{up = 1;down = 1;}max = Math.max(max,Math.max(up,down));}return max;}
}
2021年2月8日 Leetcode每日一题:978. 最长湍流子数组相关推荐
- LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)
LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...
- LeetCode 978. 最长湍流子数组(DP)
1. 题目 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > 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. Longest Turbulent Subarray | 978. 最长湍流子数组(Java)
题目 https://leetcode.com/problems/longest-turbulent-subarray/ 题解 虽然 similar questions 没列出来,但能想到之前做过的( ...
- Leetcode 978. 最长湍流子数组
978. 最长湍流子数组 显示英文描述 我的提交返回竞赛 用户通过次数196 用户尝试次数229 通过次数200 提交次数567 题目难度Medium 当 A 的子数组 A[i], A[i+1], . ...
- 【12月打卡~Leetcode每日一题】659. 分割数组为连续子序列(难度:中等)
659. 分割数组为连续子序列 给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个子序列,其中每个子序列都由连续整数组成且长度至少为 3 . 如果可以完成上述分割,则 ...
- Leetcode每日一题:842.split-array-into-fibonacci-sequenc(将数组拆分成斐波那契序列)
思路:深度优先搜索,设定最后返回的数组vec,每次搜索只处理一个数,这数可以取1位,也可以取很多位,这取决于前面两个放入vec的数的和(vec只有两个及以下的数时,直接放入),如果无法等于他俩的和,那 ...
- Leetcode每日一题:659.split-array-into-consecutive-subsequences(分割数组为连续子序列)
思路:看它贴的标签是贪心算法,我只想到了记录每个数出现的个数,并且还是数组,后来一想如果元素太大导致数组长度很长怎么办,老是想不到hash的方法,也没想到记录以nums[i]结尾的连续子序列个数: 贴 ...
最新文章
- R语言包_dplyr_1
- python codecs模块(用于执行编码转换之类的)
- php 物理路径,网站物理路径查找思路
- C++ struct结构体 实现搜索二叉树(BST)
- git连接jenkins_开普勒云平台:如何配置gitlab与Jenkins
- 高级工程师java_Java从0到高级工程师
- linux_basics
- CSS ::before 和 ::after 伪元素用法
- MySQL 入门(六)—— 索引
- WSO2 ——(10)ESB功能:服务编排
- 大雪坪剑来 Spring Cloud 教程(二):Spring Boot 集成 mybatis 实现增删改查
- N沟道MOSFET所需的高于电池的电源电压
- Adobe Photoshop CS6 for Mac 简体中文 支持retina高清屏
- 我的世界 服务器文件ess,求助服务器ess插件报错怎么解
- 条件概率和全概率公式
- 额温枪方案工作流程、测温原理、功能
- turtlebot3 在gazebo仿真下 通过 gmapping slam 建立二维平面地图——全过程
- 美团点评2017校园招聘编程题--取红包
- 【经验】转一个非常好的【SCI论文写法攻略】
- Git学习--分支(branch、merge、rebase)