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

相关推荐
DanyHope12 分钟前
《LeetCode 49. 字母异位词分组:哈希表 + 排序 全解析》
算法·leetcode·哈希算法·散列表
iAkuya15 分钟前
(leetcode) 力扣100 15轮转数组(环状替代)
数据结构·算法·leetcode
杰克尼17 分钟前
蓝桥云课-5. 花灯调整【算法赛】
java·开发语言·算法
.小墨迹18 分钟前
C++学习之std::move 的用法与优缺点分析
linux·开发语言·c++·学习·算法·ubuntu
wanghowie19 分钟前
01.02 Java基础篇|核心数据结构速查
java·开发语言·数据结构
努力学算法的蒟蒻25 分钟前
day38(12.19)——leetcode面试经典150
算法·leetcode·面试
搬砖魁首33 分钟前
ZK-ALU-在有限域上实现乘法和除法
算法·zk·alu·域运算·算术逻辑单元·模乘·蒙哥马利模约简
iAkuya41 分钟前
(leetcode)力扣100 17缺失的第一个正数(哈希)
算法·leetcode·哈希算法
断剑zou天涯1 小时前
【算法笔记】树状数组IndexTree
java·笔记·算法
sonadorje1 小时前
ECC公钥生成过程
算法·安全