# 978. Longest Turbulent Subarray 最长湍流子数组

@TOC

## # 题目描述

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]` when `k` is odd, and `A[k] < A[k+1]` when `k` is even;
• OR, for `i <= k < j`, `A[k] > A[k+1]` when `k` is even, and `A[k] < A[k+1]` when `k` is 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
``````

Note:

1. 1 <= A.length <= 40000
2. 0 <= A[i] <= 10^9

## # 解题方法

### # 虫取法

[9,4,2,10,7,8,8,1,9]

9,4,2是单调递减的三个数字，此时应该把left移动到4的位置，right仍然指向2，开始新的遍历过程。

[1,1,1,1,1,1,1]

c++代码如下：

``````class Solution {
public:
int maxTurbulenceSize(vector<int>& A) {
const int N = A.size();
if (N == 1) return 1;
int res = 1;
int left = 0, right = 1;
bool isde = false;
while (right < N) {
if (A[right] == A[right - 1]) {
left = right;
right++;
} else if (right - left == 1 || (A[right] - A[right - 1] < 0 != isde)) {
isde = A[right] - A[right - 1] < 0;
res = max(res, right - left + 1);
right ++;
} else {
left = right - 1;
}
}
return res;
}
};
``````

## # 日期

2019 年 1 月 20 日 —— 这次周赛有点简单