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;
}


posted @ 2025-03-31 20:53  丘狸尾  阅读(28)  评论(0)    收藏  举报