LC978. 最长湍流子数组(滑动窗口)
给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。
如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。
更正式地来说,当 arr 的子数组 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]。
示例 1:
输入:arr = [9,4,2,10,7,8,8,1,9]
输出:5
解释:arr[1] > arr[2] < arr[3] > arr[4] < arr[5]
示例 2:
输入:arr = [4,8,12,16]
输出:2
示例 3:
输入:arr = [100]
输出:1
向下单调合法,向上单调不合法,省略j后面不合法的遍历
同时由于求最长,内层循环指针j不用回退,省略j前面已经遍历的
边界问题的处理比较麻烦
#include <bits/stdc++.h>
#include <cstdio>
using namespace std;
int max(int a,int b){
return a>b? a:b;
}
class Solution {
public:
int maxTurbulenceSize(vector<int>& arr) {
int n = arr.size();
if(n<=1) return n;
int flag; // -1 < ; 0 = ; 1 >
int i=0,j=0,maxLen=1;
while (j<n-1) {
// 如果j是开头,则不用判断前一个flag
if(j==i){
// 如果相等,一定不是,移动i判断下个字符串
if(arr[j]==arr[j+1]){
++i;
}else if(arr[j]<arr[j+1]){
flag = -1;
maxLen = max(maxLen,2);
}else{
flag = 1;
maxLen = max(maxLen,2);
}
++j;
}else{
if(flag>0 && arr[j]<arr[j+1]){
++j;
flag = -1;
maxLen = max(maxLen,j-i+1);
}else if(flag<0 && arr[j]>arr[j+1]){
++j;
flag = 1;
maxLen = max(maxLen,j-i+1);
}else{
i=j;
}
}
}
return maxLen;
}
};
int main() {
Solution sol;
vector<int> arr = {0,1,1,0,1,0,1,1,0,0};
cout << sol.maxTurbulenceSize(arr) << endl; // 输出: 5
return 0;
}

浙公网安备 33010602011771号