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 ...
随机推荐
- prompt
[prompt] prompt() 方法用于显示可提示用户进行输入的对话框. prompt(text,defaultText) 参数 描述 text 可选.要在对话框中显示的纯文本(而不是 HTML ...
- Shared Preferences
[Shared Preferences] 1.SharedPreferences class. Interface for accessing and modifying preference da ...
- reids 基本操作
redis 基本操作 1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库.Redis全称为:Remote Dic ...
- MONGO的简单语法,新手实用
window上启动方式:(简单略) mongod --dbpath E:\study_lib\mongodb\db --port=27000 show dababases; (创建配置文件的启动方式) ...
- android显示和隐藏软键盘(转)
显示键盘: EditText editText.setFocusable(true); editText.setFocusableInTouchMode(true); editText.request ...
- 155. Min Stack (stack)
Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. pu ...
- 201. Bitwise AND of Numbers Range (Bit)
Given a range [m, n] where 0 <= m <= n <= 2147483647, return the bitwise AND(按位与) of all nu ...
- 学习Junit资料
以下是找到的一些有用的学习资料,先收藏了 http://www.blogjava.net/jiangshachina/archive/2011/12/14/366289.html http://www ...
- 公告栏添加时钟——利用canvas画出一个时钟
前言 最近在学习HTML5标签,学到Canvas,觉得很有趣.便在慕课网找了个demo练手.就是Canvas时钟. 对于canvas,w3shcool上是这么描述的: HTML5 <canvas ...
- 【centos】centos中添加一个新用户,并授权
前言 有时候给root用户不太方便,新建一个用于并赋予权限这个做法相对好些 创建新用户 创建一个用户名为:cmj [root@localhost ~]# adduser cmj 为这个用户初始化密码, ...