《LeetCode之每日一题》:88.最长湍流子数组-程序员宅基地

技术标签: 算法  leetcode  动态规划  数据结构  LeetCode  

最长湍流子数组


题目链接: 最长湍流子数组

有关题目

当 A 的子数组 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]。

也就是说,如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是湍流子数组。

返回 A 的最大湍流子数组的长度。
示例 1:

输入:[9,4,2,10,7,8,8,1,9]
输出:5
解释:(A[1] > A[2] < A[3] > A[4] < A[5])
示例 2:

输入:[4,8,12,16]
输出:2
示例 3:

输入:[100]
输出:1
提示:

1 <= A.length <= 40000
0 <= A[i] <= 10^9

题解

法一:滑动窗口
代码一:

int odd(int* arr, int arrSize, int left, int right){
    
    int maxLen = 1;
    while(right < arrSize - 1){
    
        //k为奇数位
        if (right % 2 == 1 && arr[right] > arr[right + 1]){
    
            right++;
            continue;
        }
        //且对应偶数位
        if (right % 2 == 0 && arr[right] < arr[right + 1]){
    
            right++;
            continue;
        }

        //发现不符合情况,获取最大长度
        maxLen = fmax(maxLen,right - left + 1);

        //移动
        right++;
        left = right;//重新定义左边界
    }
    maxLen = fmax(maxLen,right - left + 1);//循环外也得有一层最大长度获取
    return maxLen;
}

int even(int* arr, int arrSize, int left, int right){
    
    int maxLen = 1;
    while(right < arrSize - 1){
    
        //k为偶数位
        if (right % 2 == 0 && arr[right] > arr[right + 1]){
    
            right++;
            continue;
        }
        //且对应奇数位
        if (right % 2 == 1 && arr[right] < arr[right + 1]){
    
            right++;
            continue;
        }

        //发现不符合情况,获取最大长度
        maxLen = fmax(maxLen,right - left + 1);

        //移动
        right++;
        left = right;//重新定义左边界
    }
    maxLen = fmax(maxLen,right - left + 1);//循环外也得有一层最大长度获取
    return maxLen;
}


int maxTurbulenceSize(int* arr, int arrSize){
    
    int ret = 1, left = 0, right = 0;
    ret = fmax(odd(arr,arrSize,left,right),even(arr,arrSize,left,right));//根据k的奇偶来获取最大值
    return ret;
}

代码二:

int maxTurbulenceSize(int* arr, int arrSize){
    
    int ret = 1;
    int left = 0, right = 0;
    while (right < arrSize - 1){
    
        if (left == right){
    //窗口为1
            if (arr[left] == arr[left + 1]){
    
                left++;
            }
            right++;
        }
        else{
    //窗口不为1,当前窗口[left,right],满足湍流子数组判断条件
        //right能否右移看是否满足湍流子数组判断条件
            if (arr[right - 1] > arr[right] && arr[right] < arr[right + 1]){
    
                right++;
            } else if (arr[right - 1] < arr[right] && arr[right] > arr[right + 1]){
    
                right++;
            } else {
    //不满足条件说明,[left,right + 1]无法构成湍流子数组,我们改变窗口
                left = right;
            }
        }
        ret = fmax(ret, right - left + 1);
    }
    return ret;
}

在这里插入图片描述
法二:动态规划

在这里插入图片描述



int maxTurbulenceSize(int* arr, int arrSize){
    
    int dp[arrSize][2];

    //i > 0,当arr[i - 1] = arr[i]以i结尾的湍流子数组长度为1,
    for (int i = 0; i < arrSize; i++) {
    
        dp[i][0] = dp[i][1] = 1;
    }
	//当arr[i - 1] != arr[i]
    for (int i = 1; i < arrSize; i++) {
    
        if (arr[i - 1] > arr[i]) {
    
            dp[i][0] = dp[i - 1][1] + 1;//dp[i - 1][1]-->将arr[i - 1] > arr[i - 2]状态添加进去
        } else if (arr[i - 1] < arr[i]) {
    
            dp[i][1] = dp[i - 1][0] + 1;//dp[i - 1][0]-->将arr[i - 2] > arr[i - 1]状态添加进去
        }
    }

     int ret = 1;
     //结果出现在两种状态下的湍流子数组中
     for (int i = 0; i < arrSize; i++) {
    
        ret = fmax(ret, dp[i][0]);
        ret = fmax(ret, dp[i][1]);
    }
    return ret;
}

法三:滚动数组
在这里插入图片描述



int maxTurbulenceSize(int* arr, int arrSize){
    
    int ret = 1;
    int dp0 = 1, dp1 = 1;
    for (int i = 1; i < arrSize; i++) {
    
        if (arr[i - 1] > arr[i]) {
    
            dp0 = dp1 + 1;//满足if了
            dp1 = 1;//那么肯定不满足arr[i - 1] < arr[i]所以dp1只能为1,下同理
        } else if (arr[i - 1] < arr[i]) {
    
            dp1 = dp0 + 1;
            dp0 = 1;
        } else {
    
            dp0 = 1;
            dp1 = 1;
        }
        ret = fmax(ret, dp0);
        ret = fmax(ret, dp1);
    }
    return ret;
}

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/MerryMaking7946/article/details/118653273

智能推荐

http请求工具类HttpClientUtil(get使用body,post乱码问题解决)_((httpentityenclosingrequestbase) httppost.setenti-程序员宅基地

文章浏览阅读3.4k次。最近很多发送http请求的需求存在,书写下util1:配置需要的依赖在pom.xml中配置http相关依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <s..._((httpentityenclosingrequestbase) httppost.setentity(new inputstreamentity(i

【原创】超全自用idea常用插件记录_idea feign插件-程序员宅基地

文章浏览阅读1.7k次。注:idea插件可以使用账号同步,建议使用账号同步进行设置,这里作为使用记录_idea feign插件

回文日期_输出回文日期-程序员宅基地

文章浏览阅读3.1k次。链接:https://ac.nowcoder.com/acm/contest/216/A来源:牛客网 题目描述众所周知,小K是nowcoder的暴政苟管理,所以小K很擅长踢树,虽然本题与踢树无关小K喜欢将日期排列成yyyy-mm-dd的形式(位数不足添零补齐)的形式,虽然这与小K只会做回文字符串这道水题无关,但小K觉得日期组成的回文串也是挺可爱的。作为一个凉心出题人,小K决定给你一..._输出回文日期

深入了解C语言(函数的参数传递和函数使用参数的方法) _c语言中prog03_06了解函数-程序员宅基地

文章浏览阅读1k次。 深入了解C语言(函数的参数传递和函数使用参数的方法) 深入了解C语言(函数的参数传递和函数使用参数的方法)tangl_99(原作) C语言生成的代码在执行效率上比其它高级语言都高.现在让我们来看看C语言生成的代码具体是什么样子的.当你看完本文对于C语言的了解一定会更深一步了. 本文通过一个个实际案例程序来讲解C语言. 研究案例一 工具: Turboc C v2.0,Debug_c语言中prog03_06了解函数

Android App开发-简单控件(4)——按钮触控和图像显示_通过按钮的点击事件控制图片的现实和隐藏-程序员宅基地

文章浏览阅读1.1k次,点赞18次,收藏14次。本节介绍了按钮控件的常见用法,包括:如何设置大小写属性与点击属性,如何响应按钮的点击事件和长按事件,如何禁用按钮又该如何启用按钮,等等。_通过按钮的点击事件控制图片的现实和隐藏

数据类型分类 转换、复杂类型(复合、引用、对象类型)、ypeof的返回值、运算符02_"ypeof callback == \"function\"如何写"-程序员宅基地

文章浏览阅读73次。day02 数据类型1.回顾什么叫js?基于对象和事件驱动的解释性脚本语言js的组成ECMAScript:JavaScript的标准DOM:Document Object Model 文档对象模型BOM:Browser Object Model 浏览器对象模型JavaScript和ECMAScript的关系?前者是后者的具体实现后者是前者的标准引入方式变量存储数据的容器声明变量:var 变量名var a; //undefined命名规则:1_"ypeof callback == \"function\"如何写"

随便推点

【Linux】文件系统-程序员宅基地

文章浏览阅读1.7k次,点赞27次,收藏22次。了解磁盘的物理结构、磁盘的具体物理结构、逻辑抽象、软硬连接,动静态库

python实现ks算法_python, 在信用评级中,计算KS statistic值-程序员宅基地

文章浏览阅读456次。# -*- coding: utf-8 -*-import pandas as pdfrom sklearn.grid_search import GridSearchCVfrom sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScalerfrom sklearn.u..._ks_statistic

类加载过程 与 代码的执行顺序_类加载后代码的执行顺序-程序员宅基地

文章浏览阅读5k次。https://www.cnblogs.com/ysocean/p/8194428.html 代码的执行顺序https://www.jianshu.com/p/3556a6cca7e5类加载过程_类加载后代码的执行顺序

Oracle LiveLabs实验:Introduction to Oracle Spatial Studio_oracle_spatial 可视化-程序员宅基地

文章浏览阅读601次。本实验介绍了适用于 Oracle Spatial Studio。他既可以在云上,也可以在本地作为Java应用部署。介绍详见这里。此实验申请地址在这里,时间为120分钟。此实验的帮助见这里。本实验使用的地图为OpenStreetMap,即免费的维基世界地图。此实验会自动创建一个ADW,需要通过OCI Console完成初始化配置,然后可以通过网页访问Spatial Studio简介在本次研讨会中,您将探索 Spatial Studio 用于自助式空间分析和可视化的功能。 使用交通事故、警察局和警察_oracle_spatial 可视化

UG\NX二次开发 改变Block UI界面的尺寸_ug二次开发 调整 对话框大小-程序员宅基地

文章浏览阅读1.3k次。改变Block UI界面的尺寸_ug二次开发 调整 对话框大小

基于深度学习的股票预测(完整版,有代码)_基于深度学习的股票操纵识别研究python代码-程序员宅基地

文章浏览阅读1.3w次,点赞18次,收藏291次。基于深度学习的股票预测数据获取数据转换LSTM模型搭建训练模型预测结果数据获取采用tushare的数据接口(不知道tushare的筒子们自行百度一下,简而言之其免费提供各类金融数据 , 助力智能投资与创新型投资。)python可以直接使用pip安装tushare!pip install tushareCollecting tushare Downloading https://files.pythonhosted.org/packages/17/76/dc6784a1c07ec040e74_基于深度学习的股票操纵识别研究python代码

推荐文章

热门文章

相关标签