LeetCode 978.最长湍流子数组

给定一个整数数组 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

提示:

1 <= arr.length <= 4 * 104^44

0 <= arr[i] <= 109^99

分组循环,每组是一个湍流子数组:

cpp 复制代码
class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();

        // 初始化结果值为1,当整个数组的值都相等时,对应该最小值1
        int ans = 1;

        int i = 0;
        while (i < n - 1) {
            int start = i;
            ++i;

            // 如果两个值相等,则必然不是湍流子数组
            if (arr[i] == arr[start]) {
                continue;
            }
            
            while (i < n - 1 && (long long)(arr[i] - arr[i - 1]) * (arr[i + 1] - arr[i]) < 0) {
                ++i;
            }

            ans = max(ans, i - start + 1);
        }

        return ans;
    }
};

如果arr的长度为n,则此算法时间复杂度为O(n),空间复杂度为O(1)。

相关推荐
HelloReader4 分钟前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱3 小时前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8974 小时前
水声匹配场定位原理及实验
算法
董董灿是个攻城狮16 小时前
AI视觉连载8:传统 CV 之边缘检测
算法
AI软著研究员1 天前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish1 天前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱1 天前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者2 天前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮2 天前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者2 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶