两种方法:
1、滑动窗口
维护一个左端为left,右端为right的滑动窗口,滑动窗口内部维护的是[湍流子数组],如果说arr[right-1]>arr[right]<arr[right+1]或者说arr[right-1]>arr[right]<arr[right+1],移动right,否则的话,窗口清0,即left = right
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
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 = max(ret, right - left + 1);
}
return ret;
}
};
2、DP
定义状态dp[i][0]为以i结尾的数组,并且arr[i-1]>arr[i],dp[i][1]表示以i结尾的数组,arr[i-1]<arr[i]。
当遇到arr[i-1]<arr[i]时,我们应该把它接在arr[i-2]>arr[i-1]的后边,即dp[i][1]=dp[i][0]+1。当遇到arr[i-1]>arr[i]时,把它接在arr[i-2]<arr[i-1]的后边;即dp[i][0]=dp[i][1]+1。
code:
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
vector<vector<int>> dp(n, vector<int>(2, 1));
dp[0][0] = dp[0][1] = 1;
for (int i = 1; i < n; i++) {
if (arr[i - 1] > arr[i]) {
dp[i][0] = dp[i - 1][1] + 1;
} else if (arr[i - 1] < arr[i]) {
dp[i][1] = dp[i - 1][0] + 1;
}
}
int ret = 1;
for (int i = 0; i < n; i++) {
ret = max(ret, dp[i][0]);
ret = max(ret, dp[i][1]);
}
return ret;
}
};