算法---最长湍流子数组
题目
最长湍流子数组当 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
解决方法:
状态定义:increased[i]:以 arr[i] 结尾,并且 arr[i - 1] < arr[i] 的湍流子数组的长度;
decreased[i]:以 arr[i] 结尾,并且 arr[i - 1] > arr[i] 的湍流子数组的长度。
状态转移方程:increased[i] = decreased[i - 1] + 1 if arr[i - 1] < arr[i] for i > 0;
decreased[i] = increased[i - 1] + 1 if arr[i - 1] > arr[i] for i > 0。
初始化:只有一个元素的时候,湍流子数组的长度是 11;
输出:两个状态数组所有元素的最大值是最长湍流子数组的长度;
空间优化:空间优化:当前阶段状态只和上一个阶段状态有关,可以对状态数组进行重复利用。
public class Solution {public int maxTurbulenceSize(int[] arr) {int len = arr.length;if (len < 2) {return len;}// 以 arr[i] 结尾,并且 arr[i - 1] < arr[i] 的湍流子数组的长度int[] increased = new int[len];// 以 arr[i] 结尾,并且 arr[i - 1] > arr[i] 的湍流子数组的长度int[] decreased = new int[len];increased[0] = 1;decreased[0] = 1;int res = 1;for (int i = 1; i < len; i++) {if (arr[i - 1] < arr[i]) {increased[i] = decreased[i - 1] + 1;decreased[i] = 1;} else if (arr[i - 1] > arr[i]) {decreased[i] = increased[i - 1] + 1;increased[i] = 1;} else {increased[i] = 1;decreased[i] = 1;}res = Math.max(res, Math.max(increased[i], decreased[i]));}return res;}
}
总结:
之前做过最长的递增子数组,但是没有想到还可以有两个dp 数组结合使用,很妙。
动态规划真的很棒
所有的算法都是在积累,
只要有时间就学,几年之后,怎么也不差。
每个人都可能有一段时间,很忙,没时间看,但是一旦有时间,我们就要拿起来,继续学习。
https://leetcode-cn.com/problems/longest-turbulent-subarray/
算法---最长湍流子数组相关推荐
- LeetCode——978. 最长湍流子数组(Longest Turbulent Subarray)——分析及代码(Java)
LeetCode--978. 最长湍流子数组[Longest Turbulent Subarray]--分析及代码[Java] 一.题目 二.分析及代码 1. 动态规划(一维数组) (1)思路 (2) ...
- 2021年2月8日 Leetcode每日一题:978. 最长湍流子数组
最长湍流子数组 1.题目描述 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] ...
- 湍流参数计算c语言,力扣978.最长湍流子数组-C语言
题目 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 知足下列条件时,咱们称其为湍流子数组:算法 若 i <= k < j,当 k 为奇数时, A[k] ...
- C++描述 LeetCode 978. 最长湍流子数组
C++描述 LeetCode 978. 最长湍流子数组 大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客,唯一 ...
- Leetcode 978. 最长湍流子数组
978. 最长湍流子数组 显示英文描述 我的提交返回竞赛 用户通过次数196 用户尝试次数229 通过次数200 提交次数567 题目难度Medium 当 A 的子数组 A[i], A[i+1], . ...
- LeetCode 978. 最长湍流子数组(DP)
1. 题目 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[ ...
- LeetCode-978:最长湍流子数组
题目描述: 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k 为奇数时, A[k] > A[ ...
- 动态规划——最长湍流子数组
问题来源:leetcode 978. 最长湍流子数组 当 A 的子数组 A[i], A[i+1], ..., A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 ...
- LeetCode 978 最长湍流子数组
LeetCode 978 最长湍流子数组 题目链接 当 A 的子数组 A[i], A[i+1], -, A[j] 满足下列条件时,我们称其为湍流子数组: 若 i <= k < j,当 k ...
最新文章
- 浅谈Promise对象在ReactNative中的使用
- 案例|数据中心UPS电源系统割接实施方案
- Scala模式匹配中的变量
- 【C语言简单说】十三:逻辑运算符||
- c语言 多线程 参数,如何用C语言实现多线程
- 前端学习(1910)vue之电商管理系统电商系统之完成用户的修改
- 【搜索/推荐排序】总结
- secp256k1 php,区块链中的数学-secp256k1 签名可锻性以及解决方案
- 5不能另存为dwg_5.建立数模
- MATLAB GUI的界面归一化问题
- 区块链 Fisco bcos 智能合约(11)-深入浅出Solidity
- 电商直播运营的思路流程
- 基本粒子群算法matlab 程序
- 史上最全的贝塞尔曲线(Bezier)全解(三):贝塞尔曲线实现满屏爱心
- 计算机自带拼图程序,电脑上比较好用的拼图软件?
- 前端高效开发必备的 js 库
- 《罗密欧与朱丽叶》--[英]莎士比亚
- uniapp兼容iPhoneX头部状态栏(刘海屏)和底部小横条
- python pygame K按键说明
- 低功耗蓝牙BLE之广播
热门文章
- python名称由来_Python的由来与使用介绍
- 岳阳机器人餐厅在哪_从机器人咖啡看未来餐饮行业大方向,如何才能活下去?...
- 高斯-赛德尔迭代法简介
- 翻译java_翻译示例代码
- 15、如何在Linux和Windows下清除DNS缓存
- Set OPENCV_ENABLE_NONFREE CMake option and rebuild the library in function解决方法
- linux halt函数,常用Linux命令 reboot halt shutdown passwd vlock exit等
- 如何解一元一次方程视频_七年级数学教学视频-小邵课堂
- delphi中checkcombobox最大长度_并行光信号传输中的信道间传播时间偏差
- scrapy 怎么添加cookie_scrapy学习之爬虫练习平台5