赞
踩
目录
难度 中等
给定一个整数数组 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 * 10^4
0 <= arr[i] <= 10^9
- class Solution {
- public:
- int maxTurbulenceSize(vector<int>& arr) {
-
- }
- };
题意的湍流数组就是一上一下的意思,只有一个元素时长度为1。
先尝试定义状态表示为:dp[i] 表示以 i 位置为结尾的最长湍流数组的长度。
但是,问题来了,如果状态表示这样定义的话,以 i 位置为结尾的最长湍流数组的长度我们没法从之前的状态推导出来。因为我们不知道前一个最长湍流数组的结尾处是递增的,还是递减的。因此,我们需要状态表示能表示多一点的信息:要能让我们知道这一个最长湍流数组的结尾是递增的还是递减的。
因此需要两个 dp 表:
状态转移方程: 对于 i 位置的元素 arr[i] ,有下面两种情况:
初始化: 所有的元素单独都能构成一个湍流数组,因此可以将 dp 表内所有元素初始化为 1。 由于用到前面的状态,因此循环的时候从第二个位置开始。
从左往右,两个表一起填,最后返回两个dp表中的最大值即可。
- class Solution {
- public:
- int maxTurbulenceSize(vector<int>& arr) {
- int n = arr.size(), ret = 1;
- vector<int> f(n, 1), g(n, 1);
- // 以i位置元素为结尾的所有子数组中,呈现上升/下降状态下的最⻓湍流数组的⻓度
- for(int i = 1; i < n; ++i)
- {
- if(arr[i-1] > arr[i]) // 下降的
- {
- g[i] = f[i-1] + 1;
- }
- else if(arr[i-1] < arr[i]) // 上升的
- {
- f[i] = g[i-1] + 1;
- }
- ret = max(ret, max(f[i], g[i]));
- }
- return ret;
- }
- };

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。