Longest Turbulent Subarray LT978
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if:
- For
i <= k < j,A[k] > A[k+1]whenkis odd, andA[k] < A[k+1]whenkis even; - OR, for
i <= k < j,A[k] > A[k+1]whenkis even, andA[k] < A[k+1]whenkis odd.
That is, the subarray is turbulent if the comparison sign flips between each adjacent pair of elements in the subarray.
Return the length of a maximum size turbulent subarray of A.
Example 1:
Input: [9,4,2,10,7,8,8,1,9]
Output: 5
Explanation: (A[1] > A[2] < A[3] > A[4] < A[5])
Example 2:
Input: [4,8,12,16]
Output: 2
Example 3:
Input: [100]
Output: 1
Idea 1. Extending to a new element in the array. How to extend the solution from A[0...i] to A[0,...i, i+1]? We care about if the comparison sign has been alternated. The new length ending at i could be determined by the length ending at i-1 and the sign alternation.
len(i) = 1 if A[i-1] == A[i]
len(i) = 2 if A[i-1] != A[i] and comparison sign has not been alternated, i.e. previousSign * currentSign != -1
len(i) = len(i-1) + 1 if previousSign * currentSign == -1
Time complexity: O(n)
Space complexity: O(1)
class Solution {
public int maxTurbulenceSize(int[] A) {
int sign = 0;
int len = 1;
int maxLen = 1;
for(int i = 1; i< A.length; ++i) {
int currSign = Integer.compare(A[i-1], A[i]);
if(currSign != 0) {
if(sign * currSign != -1) {
len = 2;
}
else {
++len;
}
}
sign = currSign;
maxLen = Math.max(maxLen, len);
}
return maxLen;
}
}
1.b. save an extra variable, since we care only the consecutive comparison, 3 elements can determin if the sign has been alternated.
class Solution {
public int maxTurbulenceSize(int[] A) {
int len = 0;
int maxLen = 1;
for(int i = 0; i< A.length; ++i) {
if(i >= 2 && (Integer.compare(A[i-2], A[i-1]) * Integer.compare(A[i-1], A[i]) == -1)) {
++len;
}
else if(i >=1 && A[i-1] != A[i]) {
len = 2;
}
else {
len = 1;
}
maxLen = Math.max(maxLen, len);
}
return maxLen;
}
}
Idea 1.c recording length of the alternating block ending at i, the last two elements is either increasing or decreasing:
inc = dec + 1 if A[i] > A[i-1], reset dec = 1
dec = inc + 1 if A[i] < A[i-1], reset inc = 1
dec =1 , inc = 1 if A[i] == A[i-1] or i == 0
class Solution {
public int maxTurbulenceSize(int[] A) {
int dec = 0;
int inc = 0;
int maxLen = 0;
for(int i = 0; i< A.length; ++i) {
if(i== 0 || A[i-1] == A[i]) {
dec = 1;
inc = 1;
}
else if(A[i-1] < A[i]) {
inc = dec + 1;
dec = 1;
}
else {
dec = inc + 1;
inc = 1;
}
maxLen = Math.max(maxLen, Math.max(dec, inc));
}
return maxLen;
}
}
Idea 2. Sliding window, recording the potential starting point of the alternative block, once the block stop flipping the sign or reaching the end of the array, then caculate the length of the block. This idea reminds me the subarray min sum which find the previous smallest element and the next smallest element to find the length of block which contains larger elements.
start = i if A[i-1] == A[i]
len = i - start + 1 if i == nums.lengh -1 or Integer.compare(A[i-1], A[i]) == Integer.compare(A[i], A[i+1])
class Solution {
public int maxTurbulenceSize(int[] A) {
int start = 0;
int maxLen = 1;
for(int i = 1; i< A.length; ++i) {
int sign = Integer.compare(A[i-1], A[i]);
if(sign == 0) {
start = i;
}
else if(i == A.length-1 || sign * Integer.compare(A[i], A[i+1]) != -1) {
int len = i - start + 1;
maxLen = Math.max(maxLen, len);
start = i;
}
}
return maxLen;
}
}
Note:
1 <= A.length <= 400000 <= A[i] <= 10^9
Longest Turbulent Subarray LT978的更多相关文章
- leecode 978. Longest Turbulent Subarray(最长连续波动序列,DP or 滚动数组)
传送门:点我 978. Longest Turbulent Subarray A subarray A[i], A[i+1], ..., A[j] of A is said to be turbule ...
- LeetCode 978. Longest Turbulent Subarray
原题链接在这里:https://leetcode.com/problems/longest-turbulent-subarray/ 题目: A subarray A[i], A[i+1], ..., ...
- [Swift]LeetCode978. 最长湍流子数组 | Longest Turbulent Subarray
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...
- 978. Longest Turbulent Subarray
A subarray A[i], A[i+1], ..., A[j] of A is said to be turbulent if and only if: For i <= k < j ...
- 【LeetCode】978. Longest Turbulent Subarray 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 虫取法 日期 题目地址:https://leetco ...
- 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
Given an array of integers nums and an integer limit, return the size of the longest continuous suba ...
- 【LeetCode】1438. 绝对差不超过限制的最长连续子数组 Longest Continuous Subarray With Absolute Diff Less Than or Equal t
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址:https://leetco ...
- Monotonic Array LT896
An array is monotonic if it is either monotone increasing or monotone decreasing. An array A is mono ...
- [LeetCode] Maximum Subarray 最大子数组
Find the contiguous subarray within an array (containing at least one number) which has the largest ...
随机推荐
- Unity中的四个路径
Application.database:当前工程的Assets文件夹(编辑器) Application.StreamingAssets:IO流路径 当前工程的StreamingAssets文件夹(编 ...
- I/O复用之select
作用: 实现I/O的多路复用 该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生时或经历一段指定的时间后才唤醒它.进程将于select处阻塞,直到被检测的描述符有一个或多个 ...
- WPF背景透明内嵌WebBrowser不显示问题,即AllowsTransparency = true 和 Webbrowser 等控件显示冲突
首先感谢两位先导者: 1. 解决 WPF AllowsTransparency = true 和 Webbrowser 等控件显示冲突 原文地址:https://www.cnblogs.com/zhi ...
- Django项目的创建与管理和pycharm与Github的秘密
随笔 - 174 文章 - 21 评论 - 19 Django项目创建与管理 1.主题 这部分教程主要介绍如何通过Pycharm创建.管理.运行一个Django工程.对于Django模块的相关 ...
- Android 集成高德地图
先上一张图片看看实现的效果啦!!! 首先登陆高德的开发者平台进行创建自己的应用程序,填写对应的包名,填写sHA1值(这个我这博客中写了获取的代码,可以直接复制粘贴),说了这么多其实都是废话,来我们看重 ...
- crm作业知识点集合[一]
知识点1 1.当我们通过model建立一对多或者多对多的关系的时候,默认情况下,会关联所有的字段,如果我们使用djanog的forms的话,可以加一个属性,限制我这个字段只关联哪些字段,就是用下面的写 ...
- xml转Map,对象,Map转xml,inputs tram 转xml 字符串的工具类方法
众所周知,大家在微信开发工程中,由于微信开发文档中,对于消息的接收发送都是基础xml数据的(太坑了),所以我们需要对XML进行解析转换: 1.我们先引入所需要的依赖 dom4j (解析xml的),xs ...
- linux命令学习之:curl
curl命令是一个利用URL规则在命令行下工作的开源文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS ...
- 设置Tomcat的JAVA_OPTS参数
修改$TOMCAT_HOME/bin/catalina.bat 添加set JAVA_OPTS= ... rem ----- Execute The Requested Command ------- ...
- php使用pthreads v3多线程的抓取新浪新闻信息
我们使用pthreads,来写一个多线程的抓取页面小程序,把结果存到数据库里. 数据表结构如下: CREATE TABLE `tb_sina` ( `id` int(11) unsigned NOT ...