当前位置: 首页 > article >正文

每日一练:最长湍流子数组

978. 最长湍流子数组 - 力扣(LeetCode)

题目要求:

给定一个整数数组 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
  • 0 <= arr[i] <= 109

解法-1 动态规划 O(N):

        这个题与每日一练:等差数列划分-CSDN博客类似,nums[i] 能否与前面的数组构成湍流数组取决于nums[i]与nums[i]的大小关系,具体是大于还是小于又取决于nums[i-1]与nums[i-2]的大小关系,所以dp表需要初始化前两个位置。

        创建一个dp表f,存放以 i 为结尾的最长湍流数组的长度,填表的具体情况在代码中体现:

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();
        if (n <= 1)
            return n;

        vector<int> f(n);
        // 初始化
        f[0] = 1;
        if (arr[0] == arr[1])
            f[1] = 1;
        else
            f[1] = 2;

        int ret = f[1];
        for (int i = 2; i < n; i++) {
            if (arr[i] > arr[i - 1] && arr[i - 1] < arr[i - 2] ||
                arr[i] < arr[i - 1] && arr[i - 1] > arr[i - 2]) {
                f[i] = f[i - 1] + 1; // arr[i]与前面构成湍流数组
            } else if (arr[i] == arr[i - 1]) { // 不构成湍流数组且与arr[i-1]也不构成湍流数组
                f[i] = 1;
            } else { // 不构成湍流数组,但是与arr[i-1]构成长度为2的湍流数组
                f[i] = 2;
            }
            ret = max(ret, f[i]);
        }

        return ret;
    }
};

        优化-滑动数组减少内存消耗:

class Solution {
public:
    int maxTurbulenceSize(vector<int>& arr) {
        int n = arr.size();
        if (n <= 1)
            return n;

        int a,b,c;
        a = 1;
        if(arr[0]==arr[1])
            b = 1;
        else
            b = 2;

        int ret = b;
        for (int i = 2; i < n; i++) {
            if (arr[i] > arr[i - 1] && arr[i - 1] < arr[i - 2] ||
                arr[i] < arr[i - 1] && arr[i - 1] > arr[i - 2]) {
                c = b + 1; // arr[i]与前面构成湍流数组
            } else if (arr[i] == arr[i - 1]) { // 不构成湍流数组,且与arr[i-1]也不构成湍流数组
                c = 1;
            } else { // 不构成湍流数组,但是与arr[i-1]构成长度为2的湍流数组
                c = 2;
            }
            a = b;b = c;
            ret = max(ret, b);
        }

        return ret;
    }
};


http://www.kler.cn/news/335090.html

相关文章:

  • Lustre v6 介绍
  • 力扣10.6
  • AI赋能,旅游新纪元,看旅游大厂携程的AI实践
  • D28【python 接口自动化学习】- python基础之输入输出与文件操作
  • OracleJDBC 连接地址URL写法
  • RxSwift系列(二)操作符
  • C#中的事件、代理与任务:深入剖析发布者 - 订阅者模式中的关键元素
  • Leetcode 1498. 满足条件的子序列数目
  • 13:URL输入到页面渲染过程
  • LeetCode Hot100 | Day1 | 二叉树:二叉树的直径
  • Nginx技术深度解析与实战应用
  • 通信工程学习:什么是RARP反向地址解析协议
  • 【笔记】信度检验
  • 令牌主动失效机制范例(利用redis)注释分析
  • 系统规划与管理——1信息系统综合知识(5)
  • 联想电脑怎么开启vt_联想电脑开启vt虚拟化教程(附intel和amd主板开启方法)
  • 蓝牙定位的MATLAB仿真程序(基于信号强度,平面内的定位,四个蓝牙基站)
  • 鸿蒙OpenHarmony
  • 懒人笔记-QT程序UOS打包篇
  • 105页PPT麦肯锡:煤炭贸易企业业务战略规划方案