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)。

相关推荐
小白菜又菜5 分钟前
Leetcode 1518. Water Bottles
算法·leetcode·职场和发展
长存祈月心15 分钟前
Rust Option 与 Result深度解析
算法
杭州杭州杭州1 小时前
机器学习(3)---线性算法,决策树,神经网络,支持向量机
算法·决策树·机器学习
不语n2 小时前
快速排序(Quick Sort)详解与图解
数据结构·算法·排序算法·快速排序·双指针排序
三萬Q2 小时前
数据结构--并查集
数据结构
桦说编程2 小时前
如何在Java中实现支持随机访问的固定窗口队列
java·数据结构·后端
电鱼智能的电小鱼2 小时前
基于电鱼 ARM 工控机的AI视频智能分析方案:让传统监控变得更聪明
网络·arm开发·人工智能·嵌入式硬件·算法·音视频
初学者,亦行者3 小时前
Rust性能优化:内存对齐与缓存友好实战
算法·rust
py有趣3 小时前
LeetCode算法学习之杨辉三角
学习·算法·leetcode